Identier les facteurs latents en SHS avec R
Exemples d’application sur des données en Géographie et en Psychologie en utilisant le couple analyse factorielle exploratoire (AFE) / analyse factorielle confirmatoire (CFA)
Cette fiche présente deux méthodes d’analyse factorielle et leurs applications sous R. Ces méthodes cousines de l’analyse en composante principale, s’en distinguent notamment car elles permettent de mettre en évidence des facteurs latents plutôt que des composantes principales. Cette approche par les facteurs latents est surtout utilisée en Psychologie. Moins répandue dans les autres disciplines des sciences humaines et sociales, elle pourrait néanmoins s’avérer particulièrement utile pour répondre à des hypothèses ou besoins particuliers dans toutes les disciplines des SHS.
Pré-requis : Connaissances de base en traitement et analyse de données. Être familier des risques induits par les outliers, la multicolinéarité, etc. dans la modélisation statistique.
Introduction
1 L’analyse factorielle
Comment rendre compte, de manière simple, de la complexité des différents types de relations qui existent entre plusieurs variables d’une base de données ?
C’est à cette question que permet, entre autre, de répondre l’analyse <<<<<<< HEAD multivariée, et par extension les méthodes d’analyses factorielles qui ======= multivariée, et par extension les méthodes d’analyse factorielle qui >>>>>>> master appartiennent à ce champs de méthodes.
1.1 L’Objectif de l’analyse factorielle ?
L’objectif général de l’analyse factorielle est de réduire un nombre important d’informations (c’est-à-dire les valeurs contenues dans différentes variables) à quelques grandes dimensions. Il s’agit de synthétiser l’information. Par exemple, imaginons des chercheurs souhaitant étudier le comportement de préservation de l’environnement des français. Pour cela, ils récoltent différentes données concernant le statut socioprofessionnel des participants, leur état de santé, leur zone géographique d’habitation, leur implication dans des associations, etc. Ils recueillent donc beaucoup de données dans chacun des différents thèmes susceptibles d’expliquer leurs hypothèses. Afin de synthétiser l’information alors recueillie, et éventuellement par la suite de pouvoir dégager des profils de comportement ou des liens de causalités, <<<<<<< HEAD ils feront appel à l’une des méthodes de factorisation existante.
======= ils feront d’abord appel à l’une des méthodes de factorisation existante. >>>>>>> masterComme dans toute analyse statistique, on va chercher à expliquer la plus forte proportion de la variance (de la covariance dans le cas de l’analyse factorielle) par un nombre aussi restreint que possible de variables (appelées dans l’analyse factorielle composantes ou facteurs).
1.2 Les différents types d’analyses factorielles
L’analyse factorielle est, elle aussi, un regroupement de différentes méthodes dont les plus connues et les plus utilisées en SHS sont, pour les données quantitatives : l’analyse en composante principale (ACP) et l’analyse factorielle exploratoire (AFE) ; et pour les données qualitatives : l’analyse factorielle des correspondances (AFC) et l’analyse des correspondances multiples (ACM).
Ici nous vous parlerons des méthodes de l’analyse factorielle <<<<<<< HEAD exploratoire (AFE ou EFA en anglais) et de l’analyse factorielle ======= exploratoire (AFE, ou EFA en anglais) et de l’analyse factorielle >>>>>>> master confirmatoire (CFA en anglais) qui sont des méthodes très employées en psychologie notamment.
Ces différentes méthodes, si elles ont toutes l’objectif commun que nous avons exprimé précédemment, ont aussi des différences importantes.
Pour mieux comprendre, un rapide retour historique sur ces méthodes est utile.
1.3 Petite histoire des analyses factorielles
Les premiers à théoriser les méthodes d’analyses factorielles sont le mathématicien britannique Karl Pearson (1901) et le psychologue anglais Charles Spearman (1904).
Pearson développera sa réflexion sur les analyses en compostantes principales (ACP) (Pearson F.R.S., K., 1901). Alors que Spearman se concentrera sur l’analyse factorielle, afin de rendre compte de la variance commune partagée par les items d’un même outil psychométrique (Spearman, C., 1904). Ces pionniers des analyses factorielles travaillaient déjà sur les corrélations, et ce sont ces mêmes personnes qui ont donné leurs noms aux coefficients de corrélation de Pearson et de Spearman.
Mais c’est notamment avec les travaux du mathématicien français Jean-Paul Benzecri (Benzecri J.-P., 1973), dans les années 70, que ces méthodes vont connaître leur essor en France (Pages, J-P., et al., 1979). En particulier grâce à l’apport des représentations graphiques qui permettent de venir synthétiser et illustrer les résultats. C’est Benzecri qui va développer les méthodes sortant du modèle gaussien en prenant en compte les variables catégorielles, telles que les analyses factorielles des correspondances (AFC) et les analyses factorielles des correspondances multiples (ACM)(Pages, J-P., et al., 1979).
Si les méthodes popularisées par Benzecri ont su rester à la postérité et servir dans toutes les SHS, notamment grâce à la mise en oeuvre des méthodes pour travailler sur des données qualitatives, il peut être utile de se rappeler qu’il en existe d’autres qui les ont précédées. C’est par exemple le cas de l’analyse factorielle exploratoire (AFE). Cette méthode, si elle est très utilisée en psychologie - discipline de Spearman, reste effectivement beaucoup plus rare dans les autres sciences humaines et sociales.
2 L’ AFE pour quoi faire
L’AFE vise à explorer la structure sous-jacente d’une base de donnée en identifiant des facteurs latents qui vont expliquer les relations entre les variables de notre base de données.
Qu’est ce qu’un facteur latent ? C’est une variable qui est <<<<<<< HEAD sous-jacente, car non observée ou mesurée directement. Ce facteur ======= sous-jacente, car non observée ou non mesurée directement. Ce facteur >>>>>>> master sous-jacent est postulé pour expliquer les covariances (ou corrélations) entre l’ensemble des variables observées et mesurées (celles de notre base de données). Les variables observées, sont mesurées directement, tandis que les facteurs latents ne le sont pas.
Cette notion de facteur latent est au coeur de l’analyse factorielle exploratoire. En effet l’idée centrale de cette méthode est que nos variables mesurées sont influencées par ces facteurs latents, et que ces facteurs vont expliquer la structure des relations des variables entre elles. Chaque facteur latent est associé à un groupe de variables qui partagent une variance commune. En d’autres termes, le facteur latent “capture” l’information partagée par un ensemble de variables. Supposons que nous avons une base de données constituée de variables mesurant un ensemble de critères observables. Par exemple, lors d’un match de rugby nous avons collecté le nombre de mètres parcourus, de points marqués, du nombre de passes, de plaquages… On pourrait postuler l’existence de facteurs latents qu’on pourrait appeler “performance” et “vision de jeu”. Ces deux facteurs latents ne peuvent pas être mesurés directement, mais peuvent être postulés pour tenter d’expliquer la variation commune <<<<<<< HEAD de nos variables observées/mesurées. Notre objectif lorsque l’on réalise une AFE sera d’identifier le nombre et la nature de ces facteurs latents et de comprendre comment ils sont associés et reliés aux variables mesurées.
Cette méthode est donc particulièrement intéressante et appropriée pour comprendre les dimensions sous-jacentes des données et les relations entre les variables. Elle va permettre de faire émerger un pattern de relations entre ces variables. C’est en cela qu’elle peut s’avérer particulièrement utile. Elle permet de rendre compte de phénomènes (les facteurs latents) que l’on suppose (par exemple la vision de jeu), mais qui sont trop complexes pour être mesurés directement.
Ainsi, si on cherche à explorer et à identifier des dimensions explicatives sous-jacentes, qui influencent nos variables, comme c’est souvent le cas en SHS, l’AFE s’avérera être un bon choix. Autre avantage important de l’analyse factorielle exploratoire, c’est qu’elle permet ensuite de réaliser une analyse factorielle confirmatoire, sur laquelle nous reviendrons plus tard dans cet article.
L’ACP est très utilisée dans l’ensemble des disciplines des SHS, quelque soit l’hypothèse testée. Ceci correspond davantage à des habitudes d’utilisation ou de certaines pratiques de la donnée, qu’à une réelle réflexion sur les méthodes de factorisation. Or, l’analyse en Composante Principale et l’Analyse Factorielle Exploratoire ne répondent pas aux mêmes besoins et aux mêmes hypothèses. L’AFE répond en réalité à des besoins et des manières de penser très courantes dans toutes les SHS, et dans certains cas devrait être privilégiée à l’ACP.
Par exemple, en géographie, l’AFE peut être utilisée pour comprendre les dimensions sous-jacentes des comportements humains et des phénomènes socio-spatiaux. Elle offre un moyen exploratoire et puissant d’analyser la structure des données géographiques, d’identifier des tendances spatiales, et d’améliorer la compréhension des relations entre les variables. Voici quelques exemples concrets où l’AFE peut s’avérer utile :
La réduction de la dimensionnalité. L’AFE reste une méthode d ’analyse factorielle, son objectif est donc une “simplification” ou synthèse de la donnée. Ainsi, l’AFE permet de réduire la dimensionnalité des données en identifiant des facteurs latents explicatifs de la variance partagée entre les variables. Cela facilite la simplification de l’analyse et la synthèse des informations.
L’identification de structures spatiales. L’AFE permet d’identifier des structures spatiales latentes ou des modèles sous-jacents dans les données géographiques. Par exemple, elle peut révéler des tendances ou des regroupements dans les caractéristiques géographiques qui ne sont pas évidents à partir d’une simple observation des données brutes.
L’Analyse des relations spatiales. L’AFE peut être utilisée pour explorer les relations entre différentes variables géographiques. Par exemple, elle peut aider à identifier des facteurs qui expliquent la covariance spatiale entre des indicateurs socio-économiques, environnementaux ou démographiques. Elle est ainsi pertinente pour identifier des facteurs qui influencent la distribution spatiale des phénomènes.
La modélisation du spatial. L’AFE peut être utilisée comme une étape préliminaire pour la modélisation spatiale. Elle met en lumière les variables les plus influentes dans un modèle et simplifie la modélisation en réduisant le nombre de variables.
La validation des mesures. Il est parfois nécesaire de mesurer des concepts complexes comme la qualité de vie, le développement régional, etc. L’AFE peut être employée afin de valider les mesures en identifiant les facteurs latents qui contribuent à ces concepts et en évaluant la cohérence des mesures.
2.1 ACP et AFE et quelles ======= de nos variables observées/mesurées.
Notre objectif lorsque l’on réalise une AFE sera d’identifier le nombre et la nature de ces facteurs latents et de comprendre comment ils sont associés et reliés aux variables mesurées. Cette méthode va donc permettre de faire émerger un pattern de relations entre ces variables. La structuration des facteurs obtenus ne sera peut-être pas exactement celle envisagée au départ, mais l’AFE, bien que mentionnée comme exploratoire, nécessite d’avoir des hypothèses concernant l’existance des facteurs latents précisément testés.
Ainsi, si on cherche à explorer et à identifier des dimensions explicatives sous-jacentes, qui influencent nos variables, comme c’est souvent le cas en SHS, l’AFE s’avérera être un bon choix. Autre avantage important de l’analyse factorielle exploratoire, c’est qu’elle peut être associée à une analyse factorielle confirmatoire afin d’étayer les résultats obtenus. Nous reviendrons plus tard dans cet article sur l’analyse factorielle confirmatoire.
2.1 ACP et AFE : quelles >>>>>>> master différences ?
En réalité, les différences entre ces deux méthodes sont importantes, bien que pas si simple à appréhender intuitivement. Ces deux méthodes vont différer tant dans leur objectif que dans leur approche. Ainsi, voici trois points principaux où ces méthodes divergent et qu’il est nécessaire de prendre en compte pour faire un choix éclairé entre analyse en composantes principale et analyse factorielle exploratoire : l’objectif principal, la nature des variables et l’interprétation des résultats.
1- L’objectif principal :
ACP et AFE ont comme objectif commun la réduction de l’information, mais elles ne vont pas du tout opérer de la même manière.
- l’ACP : l’objectif est de réduire la dimensionnalité des données en utilisant les composantes principales. L’ACP va transformer les variables observées en un ensemble de variables non corrélées, que l’on appelle composantes principales. Dans l’ACP nous n’allons pas rechercher des facteurs latents. La composante principale est une combinaison linéaire des variables originales qui capture le plus possible de variance présente dans les données. Ces composantes principales sont classées par ordre décroissant de l’importance de la variance qu’elles capturent. Tout l’enjeu de l’ACP est de définir des composantes principales qui permettent de réduire la dimensionnalité des données tout en conservant l’information essentielle contenue dans les variables d’origine. Les composantes principales étant des variables non corrélées entre elles, cela simplifie l’interprétation des relations entre les observations. Pour résumer, l’objectif principal de l’ACP est de synthétiser nos données en composantes principales en tentant de conserver le maximum de variance des variables de notre base de données.
- L’AFE : vise à explorer la structure sous-jacente des données en identifiant des facteurs latents qui expliquent les relations entre les variables observées. L’objectif est de réduire la dimensionnalité des données en se centrant sur la variance partagée entre les variables et non sur l’ensemble des données. Dans le cadre de l’AFE, une partie de la variance des données ne sera pas retenue dans le modèle. L’objectif n’étant pas de conserver le maximum de variance de notre jeu de données, mais bien de se centrer sur la variance partagée entre les différentes variables.
2- La nature des variables :
- L’ACP : Les variables de notre base de données sont plutôt considérées comme des mesures directes. On cherche à réduire la dimensionnalité sans nécessairement interpréter les composantes principales en tant que telles.
- L’AFE : Les variables sont considérées comme des indicateurs de facteurs latents. On souhaite comprendre la structure sous-jacente de notre base de données.
3- Interprétabilité :
- L’ACP : Les composantes principales sont des combinaisons linéaires des variables originales et peuvent être peu interprétables du point de vue conceptuel. On va considérer le poids ou la contribution d’une variable pour chaque composante principale, ce qui va permettre de mesurer l’importance relative des variables dans la variance totale de nos données.
- L’AFE : Les facteurs latents identifiés sont souvent interprétables comme des concepts sous-jacents aux données, mais qu’il est nécessaire d’identifier et de théoriser. Pour l’interprétation, nous allons étudier les charges factorielles associées à chaque facteur latent. Il s’agit tout simplement des corrélations de chaque variable avec chaque facteur latent. Ces corrélations nous permettent d’étudier la relation entre les variables et les facteurs latents, et donc de donner du sens à ces facteurs alors identifiés. L’analyse factorielle exploratoire repose sur la comparaison entre la matrice de corrélation initiale (sans la grille de lecture obtenue suite à l’identification des facteurs latents) et la matrice de corrélation obtenue suite à l’identification des facteurs. Si la différence entre ces deux matrices est faible, alors l’analyse factorielle exploratoire obtenue est considérée comme bonne et les facteurs latents identifiés permettent bien de réduire l’information proposée. Sinon la structure factorielle des données est à repenser.
Le choix de ces deux méthodes repose globalement sur ce que l’on veut étudier et de ce que l’on veut faire de la variance. Si on considère qu’il n’y a pas de facteur latent et que l’on souhaite conserver le maximum de la variance de nos données alors l’ACP est un choix tout à fait pertinent. En revanche, si on envisage une structure sous-jacente à <<<<<<< HEAD nos données et donc la présence de facteurs latents et que l’on estime ======= nos données, et donc la présence de facteurs latents, et que l’on estime >>>>>>> master qu’il n’est pas forcément nécessaire de conserver toute la variance de nos données, mais uniquement celle qui est partagée entre nos variables, alors l’AFE sera le bon choix.
2.2 Limites de l’AFE
Comme toutes les méthodes d’analyse de données l’AFE comporte des <<<<<<< HEAD limites. La limite majeure de l’AFE, c’est que cette méthode est plus efficiente avec des variables continues. Il est tout-à-fait possible de l’utiliser avec des variables ordonnées : catégories qui suivent un ordre, (par ex. de 1. “Pas du tout d’accord” à 5. “Tout-à-fait d’accord”) en traduisant chaque catégorie par un score. On peut également réaliser ce type d’analyse avec des variables catégorielles (catégories sans échelle de valeur entre elles par ex. : profession), mais il faudra alors être beaucoup plus prudent sur l’interprétation. Et selon les cas, il peut être plus pertinent d’utiliser une autre méthode de factorisation comme l’analyse factorielle des correspondances (AFC) ou une analyse des correspondances multiples (ACM).
======= limites.Le type de variable
La limite majeure de l’AFE, repose sur le fait que cette méthode est plus efficiente avec des variables continues. Toutefois, il est tout-à-fait possible de l’utiliser avec des variables ordonnées : catégories qui suivent un ordre, (par ex. de 1. “Pas du tout d’accord” à 5. “Tout-à-fait d’accord”) en traduisant chaque catégorie par un score. On peut également réaliser ce type d’analyse avec des variables catégorielles (catégories sans échelle de valeur entre elles par ex. : profession), mais il faudra alors être beaucoup plus prudent sur l’interprétation. Et selon les cas, il peut être plus pertinent d’utiliser une autre méthode de factorisation comme l’analyse factorielle des correspondances (AFC) ou une analyse des correspondances multiples (ACM).
La taille de l’échantillon
>>>>>>> masterLa taille de l’échantillon est également un élément contraignant pour ce type d’analyse. Si l’échantillon est trop faible au regard de la taille des informations à synthétiser, les résultats obtenus risquent de surreprésenter les spécifictés de la population alors testée. La structure de l’analyse ne sera pas généralisable, mais influencée par les spécificités de l’échantillon. Il est donc important d’avoir une taille d’échantillon suffisamment importante afin de pallier ce type de <<<<<<< HEAD biais (Young and Pearce 2013).
======= biais (Young and Pearce 2013). L’échantillon devra être sélectionné selon le nombre de variables contenues dans l’analyse et la force du lien entre les variables mesurées et les facteurs latents (Watkins, M. W., 2018). Plus ce lien sera fort, moins il sera nécessaire d’avoir un échantillon conséquent. Certains auteurs indiquent que si les corrélations entre les variables manifestes et les facteurs latents sont inférieures ou égales à 0.80, 150 observations peuvent suffire à réaliser l’analyse factorielle exploratoire. En revanche, si ces mêmes corrélations sont inférieures à 0.40 il serait alors nécessaire d’avoir un échantillon d’au-moins 300 observations pour retrouver une structure factorielle stable (Schreiber, J., 2021)La force des liens
>>>>>>> masterDes corrélations trop fortes ou trop faibles entre les variables peuvent mettre en péril la mise en facteur des informations, mais pas pour les mêmes raisons. Si le set de variables soumis à la factorisation n’est pas du tout corrélé, alors les éléments présentés ne partagent pas d’éléments communs et ne peuvent pas être résumés sous un même facteur. L’hétérogénéité des informations peut tout-à-fait empêcher son résumé statistique via l’utilisation des analyses factorielles. Il n’est pas possible de réaliser des analyses factorielles sur des ensembles de variables non-corrélées. A l’inverse, si les variables retenues pour l’analyse sont trop fortement corrélées alors ceci sous-tend qu’elles contiennent des informations tellement similaires qu’elles en sont <<<<<<< HEAD redondantes. Cette redondance peut tout-à-fait biaiser la factorisation des informations, car certains éléments seront surreprésentés - sans que ======= redondantes. Cette redondance peut biaiser la factorisation des informations, car certains éléments seront surreprésentés - sans que >>>>>>> master cela ne reflète une quelconque réalité - par rapport à d’autres. Ce problème peut être résolu en sélectionnant uniquement l’une des deux variables représentatives d’un même phénomène. Par exemple, la catégorie socio-professionnelle et le niveau de diplôme sont généralement très corrélés, il faudra sélectionner l’une de ces deux variables dans le modèle d’analyse factorielle pour que celui-ci soit optimal (Tabachnick, B., & Fidell, L., 2014).
<<<<<<< HEAD =======L’interprétation
>>>>>>> masterLa subjectivité de l’interprétation peut aussi être une limite, notamment sur l’identification et l’interprétation des facteurs latents, qui dépendra beaucoup du chercheur et de son positionnement théorique.
2.3 L’AFE aujourd’hui en sciences humaines
En SHS aujourd’hui l’AFE est surtout utilisée en psychologie, et ce depuis de nombreuses années. La validation des tests psychométriques constitue un exemple classique de l’utilisation de l’AFE et de son utilisation conjointe avec l’Analyse factorielle confirmatoire (AFC). Afin de réaliser des tests standardisés pour évaluer des processus psychologiques, les psychologues ont recours à ce couple d’analyses factorielles, en réalisant une analyse factorielle exploratoire sur un premier échantillon et une analyse factorielle confirmatoire sur un second échantillon (ayant tous 2 les mêmes caractéristiques).
Les psychologues se sont tournés vers ces techniques de réduction des dimensions car, pour la plupart de leurs études, ils souhaitent se centrer sur la variance partagée entre chaque item, plutôt que de chercher à conserver la variance totale d’un ensemble de variables. Le processus méthodologique alors suivi permet de faire émerger une structure factorielle sans nécessairement la totalité des variables présentes. Cette structure factorielle permet d’observer comment les variables du jeu de données rendent compte des facteurs latents qui les sous-tendent. L’objectif finalement est de savoir “Est-ce que je mesure bien ce que je pense mesurer ?”. En d’autres termes, est-ce que les questions posées aux répondants sont adaptées pour accéder à une dimension latente non appréhendable directement.
Un point important nous semble à présent à souligner, sur l’utilisation des analyses factorielles exploratoires et confirmatoires. A partir du moment où un test psychométrique est validé, c’est-à-dire qu’il a déjà été éprouvé par le couple AFE/AFC sur un jeu de données assez conséquent, avec une population ayant les mêmes caractéristiques, il n’est pas nécessaire de remettre en cause la structure du test et nous pouvons directement procéder à une analyse factorielle confirmatoire, afin de vérifier si le modèle alors pré-établi par d’autres, s’ajuste à nos données. Ceci est conseillé afin de ne pas multiplier les tests statistiques et entraîner une inflation des résultats faussements positifs (encore appelés erreur de type II).
Cette approche statistique, peut tout-à-fait être appliquée aux autres disciplines des SHS, à la fois sur l’exploration des bases de données (AFE), ou sur une validation de modèle, ou encore une comparaison dans le temps (couple AFE/AFC). Nous verrons dans cet article comment adapter ce processus statistique à des données non psychologiques.
3 Les packages
if (!require("pacman")) install.packages("pacman")
<<<<<<< HEAD
pacman::p_load(correlation, corrplot, dplyr, EFA.dimensions, ggraph, ggplot2, lavaan, nFactors, parallel, parameters, psych, RColorBrewer, rrcov, see, table1, usdm)A quoi servent ces différents packages ? :
pacman : est un package de management de packages.
here <<<<<<< HEAD : permet de gérer les chemin d’accès au ein de notre projet
=======
: permet de gérer les chemin d’accès au sein de notre projet
>>>>>>> master
les packages correlation et corrplot permettent de réaliser des corrélations et des graphiques tels que des corrélogrammes.
dplyr est un package de manipulation de données.
Les packages EFA.dimensions, nfactors, psych et parallel sont des packages utilisés pour vérifier si les données sont factorisables grâce à différents indices statistiques (KMO, etc.). Ils permettent également de déterminer le nombre de facteurs optimal à retenir selon le set de données soumis à l’analyse.
ggraph, ggplot2, RColorBrewer et see sont des packages dédiés à la production de représentations graphiques.
Le package lavaan permet de réaliser des modèles statistiques impliquant des variables latentes, telles qu’elles existent dans les Analyses factorielles exploratoires et confirmatoires.
Les packages parameters, et table1 sont utilisés dans cette fiche pour réaliser des statistiques descriptives et des mises en forme de sortie exploitables directement.
<<<<<<< HEAD
Le package rrcov permet de détecter les multioutliers d’un jeu de données en se basant sur la méthode MCD.
=======
>>>>>>> master
Le package usdm comprend différentes fonction permettant d’explorer l’impact de différentes sources d’incertitudes dans des mesures d’association. Nous utiliserons surtout les fonctions permettant de mesurer la multicolinéarité entre des variables.
Le package effectsize pour interpréter les coefficients de l’analyse factorielle confirmatoire
Les packages semPlot et semTools pour réaliser des equations structurelles méthode à laquelle appartient l’analyse factorielle confirmatoire
4 Les données
L’idée de cet article est de présenter l’analyse factorielle exploratoire et de voir comment elle peut constituer une alternative à <<<<<<< HEAD l’analyse en composante principale. L’AFE est très utilisée en psychologie, mais beaucoup moins dans d’autres disciplines des SHS. Pour illustrer l’intérêt de ces méthodes en dehors de la psychologie, dans un premier temps nous utiliserons des données issues de travaux en géographie et dans un deuxième temps de données démographiques. Ces dernières portent sur l’ensemble des pays du monde et sont publiées dans le cadre du bulletin d’information scientifique “Population et Société” produit par l’INED. Dans les deux cas la dimension spatiale de ces données ne sera pas exploitée, ce n’est pas l’objectif des analyses factorielles. Dans un troisième temps, une analyse factorielle exploratoire sera réalisée sur des données provenant de recherches en Psychologie.
======= l’analyse en composante principale. Pour illustrer l’intérêt de ces méthodes en dehors de la psychologie, nous utiliserons des données issues de travaux en géographie. Ces dernières portent sur le prix de l’immobilier. La dimension spatiale de ces données ne sera pas exploitée, ce n’est pas l’objectif des analyses factorielles. >>>>>>> master5 Mise en pratique : exemple du prix de l’immobilier en France hexagonale
Les données du prix de l’immobilier par EPCI (prix médian au m²) sont issues des ventes observées sur l’année 2018, extraites depuis la base de données des notaires de France par Frédéric Audard et Alice Ferrari. Ce fichier a été simplifié pour ne conserver que les variables d’intérêts parmi une cinquantaine Les données statistiques proviennent de l’INSEE (année 2019) : 9 variables ont été choisies pour leur potentialité à expliquer les variations des prix de l’immobilier, concernant la population, le logement et les revenus et niveaux de vie.
Ce fichier est composé des 9 variables suivantes :
- prix_med : prix médian par EPCI à la vente au m²
- perc_log_vac : % logements vacants
- perc_maison : % maisons
- perc_tiny_log : % petits logements
- dens_pop : densité de population
- med_niveau_vis : médiane du niveau de vie
- part_log_suroccup : % logements suroccupés
- part_agri_nb_emploi : % agriculteurs
- part_cadre_profintellec_nbemploi : % cadres et professions intellectuelles
# Chargement des données de base
library(here)
csv_path <- here("data", "immo_afe.csv")
immo <- read.csv2(csv_path, row.names=1)
### Centrer et réduire les variables
dfz <- data.frame(scale(immo, center=T, scale=T))Il est extrêmement recommandé de centrer-réduire ses données pour
réaliser une analyse statistique telle qu’une analyse factorielle, ou
plus généralement lorsque l’on travaille avec des variables n’étant pas
sur les mêmes échelles, sur les mêmes ordres de grandeurs. Cela implique
de faire subir à nos données une transformation statistique visant à ce
qu’elles aient une moyenne de 0 et un écart-type de 1. On parle aussi en
statistique de standardisation. Cette transformation permet de conserver
la variabilité de nos données (la distance entre chaque valeur reste
inchangée), tout en les rendant comparables (elles sont placées sur une
même échelle). Dans le cadre de modélisations statistiques, il est
nécessaire de réaliser cette opération sur les variables explicatives du
modèle. Sur R on peut facilement réaliser cette opération avec la
fonction scale() - que nous utilisons dans notre exemple -
ou à “la main”. L’opération est simple : on soustrait chaque valeur par
la moyenne puis on divise chaque valeur par l’écart-type.
La première étape étant toujours la description des données, voici un tableau récapitulatif de nos variables :
table1(~ prix_med + perc_log_vac + perc_maison + perc_tiny_log + dens_pop + med_niveau_vis + part_log_suroccup + part_agri_nb_emploi + part_cadre_profintellec_nbemploi , data=immo) | Overall (N=1223) |
|
|---|---|
| prix_med | |
| Mean (SD) | 0.0000000000000000969 (1.00) |
| Median [Min, Max] | -0.265 [-1.43, 11.2] |
| perc_log_vac | |
| Mean (SD) | 0.00618 (0.996) |
| Median [Min, Max] | -0.0678 [-2.75, 3.33] |
| perc_maison | |
| Mean (SD) | -0.00247 (1.00) |
| Median [Min, Max] | 0.300 [-3.73, 1.17] |
| perc_tiny_log | |
| Mean (SD) | 0.00269 (1.00) |
| Median [Min, Max] | -0.287 [-1.31, 6.44] |
| dens_pop | |
| Mean (SD) | 0.0000355 (1.00) |
| Median [Min, Max] | -0.236 [-0.386, 22.8] |
| med_niveau_vis | |
| Mean (SD) | -0.00147 (1.00) |
| Median [Min, Max] | -0.202 [-2.10, 6.95] |
| part_log_suroccup | |
| Mean (SD) | -0.000331 (1.00) |
| Median [Min, Max] | -0.303 [-1.23, 7.35] |
| part_agri_nb_emploi | |
| Mean (SD) | 0.000627 (1.00) |
| Median [Min, Max] | -0.264 [-1.07, 5.68] |
| part_cadre_profintellec_nbemploi | |
| Mean (SD) | 0.00189 (1.00) |
| Median [Min, Max] | -0.157 [-1.91, 7.50] |
La réalisation des représentations graphiques permet d’appréhender les distributions de nos variables et leurs éventuelles spécificités.
dfgraph<-subset(immo, select = c(prix_med, perc_log_vac, perc_maison, perc_tiny_log, dens_pop, med_niveau_vis, part_log_suroccup, part_agri_nb_emploi, part_cadre_profintellec_nbemploi))
par( mfrow= c(3,3) )
=======
La première étape étant toujours la description des données, voici le
code pour réaliser un tableau récapitulatif de nos variables :
table1(~ prix_med + perc_log_vac + perc_maison + perc_tiny_log + dens_pop + med_niveau_vis + part_log_suroccup + part_agri_nb_emploi + part_cadre_profintellec_nbemploi , data=immo)
La réalisation des représentations graphiques permet d’appréhender
les distributions de nos variables et leurs éventuelles spécificités.
Voici une façon de réaliser un diagramme des distributions de nos
variables.
dfgraph<-subset(immo, select = c(prix_med, perc_log_vac, perc_maison, perc_tiny_log, dens_pop, med_niveau_vis, part_log_suroccup, part_agri_nb_emploi, part_cadre_profintellec_nbemploi))
par(mfrow = c(3,3))
>>>>>>> master
h1 <- hist(dfgraph$prix_med, main=NULL)
h2 <- hist(dfgraph$perc_log_vac, main=NULL)
h3 <- hist(dfgraph$perc_maison, main=NULL)
h4 <- hist(dfgraph$perc_tiny_log, main=NULL)
h5 <- hist(dfgraph$dens_pop, main=NULL)
h6 <- hist(dfgraph$med_niveau_vis, main=NULL)
h7 <- hist(dfgraph$part_log_suroccup, main=NULL)
h8 <- hist(dfgraph$part_agri_nb_emploi, main=NULL)
h9 <- hist(dfgraph$part_cadre_profintellec_nbemploi, main=NULL)
<<<<<<< HEAD

=======

>>>>>>> master
5.1 Les pré-requis de
l’analyse factorielle
Comme toutes les méthodes statistiques les analyses factorielles ont
un certain nombre de pré-requis à vérifier. Ne pas en tenir compte nous
expose à des résultats biaisés voire complètement erronés.
5.1.1 Les Outliers :
comment les gérer ?
La question du traitement de ces individus extrêmes est loin d’être
simple. Elle doit faire l’objet d’une réflexion et de choix importants
qu’il faut pouvoir assumer tant statistiquement que théoriquement.
Les outliers sont nos individus extrêmes. Il est toujours nécessaire
de pouvoir les identifier afin de savoir comment les gérer. L’enjeu
autour de ces individus c’est qu’ils vont nécessairement influencer
(voire fausser) les résultats de nos analyses. L’analyse obtenue sera
différente si on fait le choix de les supprimer ou de les conserver
(Zijlstra et al. 2011).
<<<<<<< HEAD
5.1.1.1 La méthode MCD
:
Il existe un grand nombre d’indicateurs et de distances différentes
qui permettent d’identifier des outliers. Afin de choisir la bonne
méthode, il est important de se rappeler dans quel contexte nous nous
trouvons et quelle analyse nous souhaitons réaliser.
Dans le cadre des analyses multivariées, au sein duquel nous nous
trouvons avec les différentes analyses factorielles, il est nécessaire
de rechercher les multioutliers. Ce sont des valeurs extrêmes sur
l’ensemble des variables de notre échantillon de variables. Certains
individus peuvent ne pas avoir de caractéristiques extrêmes lorsque
celles-ci sont étudiées séparément, mais se révéler être très différents
du reste de l’échantillon sur un pattern de variables. Dans le cadre des
analyses multivariées, il est essentiel de s’assurer que de telles
particularités ne viennent pas perturber la qualité des résultats
obtenus. Ne pas retirer les valeurs extrêmes expose à centrer l’analyse
des résultats sur la distance entre cette valeur très différente du
reste de l’échantillon et les autres valeurs. Ceci donc au détriment des
variabilités qui pourraient être contenues dans le reste de
l’échantillon. Ces variabilités seront donc écrasées, et paraitront donc
bien minimes face à la distance émise par la ou les valeurs
extrêmes.
Il existe de nombreuses méthodes pour identier ces individus
extrêmes. Une méthode robuste qui fait consensus dans le cadre de
données multidimensionnelles (c’est à dire corrélées entre elles) est la
méthode MCD. Elle a été théorisé par Christophe Leys et ses
collaborateurs en 2018 (Leys et al. 2018). Cette distance est elle même
basée en partie sur la distance de Mahalanobis, et sa variante, la
Mahalanobis robuste, qui ont été développées respectivement par Prasanta
Chandra Mahalanobis en 1936 (Mahalanobis, C., P, 1936) et Gnanadesikan
& Kettenring en 1972 (Gnanadesikan, R. & Kettenring, J. R.,
1972).
La distance de Mahalanobis se base sur la moyenne et la covariance de
tous les individus de notre base de données y compris les outliers.
Cette distance est donc elle même très influencée par nos individus
extrêmes. Cela pose donc une question sur la réelle identification des
outliers. Leys et al. proposent donc une nouvelle méthode qui repose sur
le calcul des paramètres du sous-ensemble de notre base de données qui a
été défini comme étant le plus central. Ce sous-ensemble est issu d’une
itération permettant de déterminer quel sous-ensemble peut être
considéré comme le plus central.
5.1.1.2 Identification
des Outliers avec la méthode MCD :
Pour utiliser cette méthode il existe plusieurs packages comme
notamment performance, robustbase ou encore
rrcov. Ces trois packages sont sur le cran et permettent de
calculer efficacement la distance entre nos données avec la méthode MCD.
Avant de débuter le calcul il est très important de savoir qu’une des
limites majeures de cette méthode est qu’elle ne peut pas gérér les
valeurs manquantes dans nos bases de données. Elle ne fonctionne que sur
des données complètes, il faudra donc imputer les données manquantes ou
les supprimer en amont. La fonction CovMcd du package rrcov
peut tourner avec des données manquantes, elle les gère en les
supprimant. Nous faisons le choix de présenter cette méthode dans un
premier temps notamment pour ses sorties graphiques qui peuvent s’avérer
être des aides efficaces à l’identification des outliers.
#MCD avec le package rrcov
library(rrcov)
# 1- calcul de la distance MCD
mcd_result <- CovMcd(dfz, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
plot(mcd_result, which="all")




1- Distance-Distance plot : Diagrame de distance entre la méthode MCD
et la distance de Mahalanobis
2- Distance plot : Diagramme de Distance de la méthode MCD
3- X² QQ-Plot : diagramme Quantile-Quantile qui permet d’évaluer la
pertinence de l’ajustement d’une distribution donnée à un modèle
théorique. Ici l’ajustemet de la méthode MCD à la distribution théorique
du X².
4- Scree plot : comparaison des valeures propres entre la méthode
robuste et classique.
Le package performance permet également d’identifier
directement les outliers ainsi que de synthétiser l’information dans un
data frame. Ceci peut s’avérer très utile pour manipuler les données,
par exemple isoler facilement les outliers et les travailler
spécifiquement. En revanche, les visualisations issues de
performance ne sont pas très lisibles quand il y a de
nombreux outliers.
# MCD avec le package performance
library(performance)
# 1- calcul de la méthoe MCD
out<-check_outliers(dfz, method = "mcd", thresold = 0.75)
#2- Affichage des résultats
out
275 outliers detected: cases 1, 8, 19, 22, 25, 27, 30, 31, 32, 34, 36,
37, 46, 47, 52, 62, 63, 66, 67, 74, 75, 77, 81, 82, 90, 98, 116, 118,
129, 142, 143, 145, 146, 147, 173, 177, 178, 180, 192, 214, 219, 225,
232, 243, 247, 260, 261, 266, 267, 269, 271, 272, 273, 274, 276, 277,
278, 279, 280, 283, 285, 287, 288, 292, 293, 298, 303, 313, 314, 338,
343, 350, 353, 357, 367, 371, 382, 383, 389, 390, 400, 418, 423, 426,
429, 446, 447, 450, 471, 473, 475, 480, 482, 483, 491, 507, 526, 549,
555, 569, 578, 581, 584, 604, 645, 651, 654, 665, 666, 669, 671, 674,
690, 692, 694, 695, 702, 709, 715, 717, 718, 723, 737, 738, 739, 740,
741, 758, 765, 768, 769, 770, 771, 774, 782, 795, 796, 797, 798, 799,
800, 801, 803, 816, 817, 818, 819, 821, 825, 833, 850, 853, 854, 856,
858, 861, 862, 871, 872, 874, 878, 880, 884, 888, 889, 891, 893, 896,
897, 898, 908, 918, 920, 921, 922, 924, 927, 929, 933, 934, 941, 942,
943, 952, 961, 968, 969, 970, 974, 985, 987, 1000, 1002, 1003, 1015,
1016, 1017, 1019, 1021, 1022, 1024, 1026, 1028, 1029, 1031, 1032, 1033,
1034, 1040, 1050, 1051, 1053, 1056, 1057, 1059, 1060, 1062, 1063, 1065,
1069, 1070, 1072, 1080, 1083, 1091, 1092, 1094, 1096, 1097, 1098, 1117,
1123, 1124, 1126, 1127, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138,
1139, 1140, 1147, 1149, 1151, 1153, 1154, 1155, 1156, 1159, 1160, 1163,
1168, 1173, 1175, 1176, 1178, 1183, 1185, 1186, 1188, 1202, 1207, 1214,
1215, 1216, 1217, 1219, 1220, 1221, 1222, 1223.
- Based on the following method and threshold: mcd (30).
- For variables: prix_med, perc_log_vac, perc_maison, perc_tiny_log,
dens_pop, med_niveau_vis, part_log_suroccup, part_agri_nb_emploi,
part_cadre_profintellec_nbemploi.
Row Distance_MCD Outlier_MCD Outlier
1 1 28.600638 1 1
2 2 4.498179 0 0
3 3 18.643357 0 0
4 4 18.049748 0 0
5 5 6.770191 0 0
6 6 4.987402 0 0
# row : l'identifiant de la ligne correspondant dans le dataframe immo.
# Distance_MCD : la distance calculée selon la méthode MCD, plus elle est importante plus l'individu est extrême
# Outlier_MCD : probalité que l'individu soit un outlier selon la méthode MCD.1 l'individu est un outlier, 0 ce n'est pas le cas.
# Outlier : l'individu est-il un outlier. 1 oui et 0 non
# Pour éventuelement avoir tous nos outliers
filtered_data <- dfz[outliers_info$Outlier_MCD >0, ]
dfz$Row <- seq_len(nrow(dfz))
dfz$name<- rownames(dfz)
data <- merge(dfz, outliers_info, by = "Row")
dfz$Row <- NULL
dfz$name <- NULL
# Exemple de visualisation avec ggplot
# ind_outlier <- filter(outliers_info, outliers_info$Outlier_MCD == 1)
#ggplot(ind_outlier)+
# geom_bar(aes(x=reorder(Row, Distance_MCD), y=Distance_MCD),fill = "#112446", stat = "identity") +
# coord_flip() + theme_minimal()
Nous avons donc ainsi calculé pour chaque ligne sa distance selon la
méthode MCD. On note dans notre cas qu’un individu se détache
particulièrement. Il s’agit de l’EPCI de la ligne 266 avec l’identifiant
200054781.
Cette étape d’identification est essentielle car lourde de
conséquences.
Que faire des outliers ? Les conserver en prenant le risque qu’ils
biaisent nos résultats ou les retirer mais en perdant le sens de notre
analyse ?
Par exemple, dans notre cas, cet individu de la ligne 266 correspond
au grand Paris. Il devient beaucoup plus aisé de comprendre pourquoi cet
individu est aussi particulier (nous rappelons qu’il y a le prix de
l’immobilier au m² dans nos variables), mais aussi des enjeux de le
supprimer ou non de notre analyse. Le supprimer c’est retirer le grand
Paris de note analyse des prix de l’immobilier en France hexagonale.
=======
Il existe un grand nombre d’indicateurs et de distances différentes
qui permettent d’identifier des outliers. Nous ne les présenterons pas
dans le cadre de cet article. Il existe différents travaux sur le sujet
pouvant vous éclairer, dont voici un aperçu (Aguinis et al. 2013 ;
Bakker, M., & Wicherts, J. M., 2014 ; Leys et al. 2018 ; Leys et
al. 2019, etc.).
Nous avons sorti les outliers de notre base de données. Petite
précision, dans notre exemple une seule observation était considérée
comme extrême, il s’agissait de l’individu de la ligne 266 correspondant
au grand Paris. Il devient beaucoup plus aisé de comprendre pourquoi cet
individu est aussi particulier (nous rappelons qu’il y a le prix de
l’immobilier au m² dans nos variables), mais aussi des enjeux de le
supprimer ou non de notre analyse. En effet, le supprimer c’est retirer
le grand Paris de notre analyse des prix de l’immobilier en France
hexagonale, avec les conséquences théorique que cela peut impliquer.
>>>>>>> master
Pour cet article nous faisons le choix de le supprimer de notre
analyse. Nous cherchons à mettre en évidence les facteurs latents,
s’exprimant par nos variables mesurées, qui caractérisent les EPCI de la
France Hexagonale. Or malheureusement si nous conservons le grand Paris
nous nous exposons à ne pas observer la variabilité des différentes EPCI
de l’haxagone, mais uniquement de la distance entre le grand Paris et
les autres EPCI de notre base de données. En effet, le grand Paris étant
tellement éloigné des autres EPCI sur l’ensemble des variables de notre
base de données que celui-ci écrase les variabilités entre les autres
communes. Afin de pouvoir faire émerger une structure factorielle qui
ait du sens entre nos EPCI, nous faisons le choix de sortir le grand
Paris de notre base de données.
Attention, la suppression des outliers entraîne des considérations
théoriques. Supprimer une observation telle que le Grand Paris n’est pas
anodin sur l’analyse des résultats concernant le prix de l’immobilier en
France hexagonale. Toutefois, laisser une telle observation empêche sa
lecture selon nos hypothèses, car le focus serait fait sur la distance
entre le Grand Paris et le reste de nos données, alors que ce n’est pas
notre question. S’il ne paraît pas justifiable théoriquement de
supprimer cette observation, alors le choix de la méthode statistique
<<<<<<< HEAD
doit être questionné. Elle n’est peut-être pas la plus adaptée pour
traiter les données et répondre aux hypothèses alors formulées.
Nous supprimons donc le grand Paris de notre base de données :
A présent, vérifions si d’autres multioutliers se détachent au sein
de notre base de donnée. En théorie, il faut répéter cette opération
plusieurs fois, jusqu’à ce que l’on observe une homogénéité des données
et une abscence de valeurs extrêmes.
#MCD avec le package rrcov
library(rrcov)
# 1- calcul de la distance MCD
mcd_resultp <- CovMcd(dfzp)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
plot(mcd_resultp, which="all")




Contrairement à l’exemple précédent, avec la présence du Grand Paris,
les représentations graphiques indiquent que si des valeurs se détachent
et pourraient tout-à-fait être considérées comme extrêmes, elles restent
proches du reste de l’ensemble de données. La distance n’est donc pas
aussi importante entre les EPCI qu’avec la présence du Grand Paris. Il
faudra conserver cette information lors de l’analyse des résultats qui
seront donc à interpréter avec précaution.
Vérifions si les distributions de nos variables ont été impactées par
cette suppression.
par( mfrow= c(3,3) )
h1_1 <- hist(dfzp$prix_med, main=NULL)
h2_1 <- hist(dfzp$perc_log_vac, main=NULL)
h3_1 <- hist(dfzp$perc_maison, main=NULL)
h4_1 <- hist(dfzp$perc_tiny_log, main=NULL)
h5_1 <- hist(dfzp$dens_pop, main=NULL)
h6_1 <- hist(dfzp$med_niveau_vis, main=NULL)
h7_1 <- hist(dfzp$part_log_suroccup, main=NULL)
h8_1 <- hist(dfzp$part_agri_nb_emploi, main=NULL)
h9_1 <- hist(dfzp$part_cadre_profintellec_nbemploi, main=NULL)

=======
doit être questionnée. Elle n’est peut-être pas la plus adaptée pour
traiter les données et répondre aux hypothèses alors formulées.
Vous pouvez charger les données propres dans le dossier
data, le fichier s’apelle dfzp.csv. Voici à
nouveau le lien de téléchargement ci-dessous.
# Chargement des données de base
library(here)
csv_path <- here("data", "dfzp.csv")
dfzp <- read.csv(csv_path, row.names=1)
Il faut désormais vérifier si les distributions de nos variables ont
été impactées par cette suppression de nos outliers afin vérifier que
les analyses envisagées sont toujours réalisables.
dfgraph2<-subset(dfzp, select = c(prix_med, perc_log_vac, perc_maison, perc_tiny_log, dens_pop, med_niveau_vis, part_log_suroccup, part_agri_nb_emploi, part_cadre_profintellec_nbemploi))
par(mfrow = c(3,3))
h1 <- hist(dfgraph2$prix_med, main=NULL)
h2 <- hist(dfgraph2$perc_log_vac, main=NULL)
h3 <- hist(dfgraph2$perc_maison, main=NULL)
h4 <- hist(dfgraph2$perc_tiny_log, main=NULL)
h5 <- hist(dfgraph2$dens_pop, main=NULL)
h6 <- hist(dfgraph2$med_niveau_vis, main=NULL)
h7 <- hist(dfgraph2$part_log_suroccup, main=NULL)
h8 <- hist(dfgraph2$part_agri_nb_emploi, main=NULL)
h9 <- hist(dfgraph2$part_cadre_profintellec_nbemploi, main=NULL)

>>>>>>> master
5.1.2 Analyse de la
matrice de corrélation
L’analyse des corrélations est une étape toujours essentielle dans
l’analyse de données, et notamment dans le cadre de la modélisation
statistique.
Cette étape est fondamentale pour plusieurs raisons. D’abord car elle
nous permet d’étudier les relations entre nos variables, ce qui va nous
donner des indications sur le meilleur modèle pour nos données. En
effet, des corrélations trop fortes ou à l’inverse une absence totale de
corrélation peut poser de nombreux problèmes comme nous l’avons évoqué
précédemment. Par exemple:
- La multi-colinéarité : Lorsque des variables sont trop
fortement corrélées (positivement ou négativement) cela pose un problème
de multi-colinéarité. Les variables sont tellement liées qu’il devient
difficile de distinguer leur impact individuel, cela va rendre les
résultats peu fiables. Il deviendra compliqué d’interpréter les
coefficients et de comprendre de quoi rend-il vraiment compte.
- Des risques de surajustement : Un modèle avec des
prédicteurs trop fortement corrélés va être surajusté et donc ne sera
pas pertinent dans son rôle prédictif.
- Une instabilité du modèle : Les modèles avec des variables
trop fortement corrélées sont instables. La moindre variation dans les
données pourra provoquer de très grandes variations dans les
résultats.
- Un modèle non optimisé : Un modèle doit respecter le
principe de parcimonie. Il ne faut pas qu’il contienne de variables
redondantes (corrélations trop fortes) ou inutiles (absence de
corrélations).
- Un modèle nul : Une absence totale de corrélations remet en
question la pertinence de tester, dans un même modèle, des variables qui
n’auraient donc aucun rapport entre elles.
Comme nous avons pu l’observer précédemment avec les histogrammes des
distributions de nos variables, celles-ci ne suivent pas une loi
normale. Le coeficient de corrélation de Pearson n’étant pas stable sur
des données non-normales, nous lui préfererons celui de Spearman pour
faire notre matrice.
<<<<<<< HEAD
# Matrice de corrélation
cor <- correlation(dfzp, method = "spearman")
cor %>%
summary(redundant = FALSE)
=======
# Matrice de corrélation
cor <- correlation(dfzp, method = "spearman")
cor %>%
summary(redundant = FALSE)
>>>>>>> master
# Correlation Matrix (spearman-method)
Parameter | part_cadre_profintellec_nbemploi | part_agri_nb_emploi | part_log_suroccup | med_niveau_vis | dens_pop | perc_tiny_log | perc_maison | perc_log_vac
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
prix_med | 0.55*** | -0.59*** | 0.45*** | 0.64*** | 0.61*** | 0.42*** | -0.52*** | -0.79***
perc_log_vac | -0.34*** | 0.44*** | -0.21*** | -0.56*** | -0.46*** | -0.14*** | 0.30*** |
perc_maison | -0.59*** | 0.70*** | -0.75*** | -0.24*** | -0.53*** | -0.72*** | |
perc_tiny_log | 0.69*** | -0.69*** | 0.80*** | 0.20*** | 0.65*** | | |
dens_pop | 0.71*** | -0.81*** | 0.45*** | 0.46*** | | | |
med_niveau_vis | 0.44*** | -0.42*** | 0.07* | | | | |
part_log_suroccup | 0.54*** | -0.62*** | | | | | |
part_agri_nb_emploi | -0.75*** | | | | | | |
p-value adjustment method: Holm (1979)
La matrice obtenue indique que l’ensemble de nos variables sont
corrélées. Nous ne sommes pas en présence d’une hétérogénéité
d’informations. Nous pouvons donc rechercher une structure sous-jacente
à cet ensemble de variables qui partagent une part de variance commune
entre-elles et donc réaliser uen analyse factorielle.
Toutefois, on observe entre certaines variables des corrélations
fortes, notamment entre la part de logement sur-occupés
(part_log_suroccup) et le pourcentage de maisons
(perc_maison) avec un coefficient de -0.75. Ou encore entre
le pourcentage de logements sur-occupés et le pourcentage de petits
logements (perc_tiny_log) avec un coefficient de
corrélation de 0.80. La question à se poser est de savoir s’il est
absolument nécessaire de conserserver toutes ces variables.
Apportent-elles toutes une part d’information singulière ou est-on en
présence de redondance d’information entre nos variables ? Bref leur
co-présence dasn notre modèle n’est-elle pas source de biais?
Pour faire ce choix il faut appliquer le principe de parcimonie. Ce
principe indique qu’entre deux choix qui expliquent de manière adéquate
les observations, il faut tendre vers le modèle le plus simple et le
moins complexe.
Ici nous faisons le choix de conserver toutes les variables, bien que
très corrélées, nous estimons qu’elles ne renvoient pas à la même
information et souhaitons les conserver dans notre modèle.
Vérifions tout de même si nous ne sommes pas en présence d’une
multicolinéarité. C’est-à-dire que plusieurs variables partagent une
part de variance importante, ce qui peut amener à sur-représenter un
phénomène et biaiser les résultats lors d’une analyse factorielle
exploratoire. Afin de vérifier la multicolinéarité entre nos variables
nous utiliserons le VIF Variance Inflation Factor. Cet indice
est habituellement utilisé pour des modèles de régressions, toutefois
Kyriazos & Poga ont démontré son utilité dans le cadre des analyses
factorielles (Kyriazos & Poga, 2023).
<<<<<<< HEAD
=======
>>>>>>> master
No variable from the 9 input variables has collinearity problem.
The linear correlation coefficients ranges between:
min correlation ( part_log_suroccup ~ med_niveau_vis ): 0.07115077
max correlation ( part_agri_nb_emploi ~ dens_pop ): -0.8051288
---------- VIFs of the remained variables --------
Variables VIF
1 prix_med 4.593899
2 perc_log_vac 2.263956
3 perc_maison 3.297333
4 perc_tiny_log 6.445563
5 dens_pop 2.089354
6 med_niveau_vis 2.137548
7 part_log_suroccup 6.894329
8 part_agri_nb_emploi 1.813606
9 part_cadre_profintellec_nbemploi 3.115692
Bien que la fonction ne nous signale aucun problème de
multicolinéarité, nous observons toutefois 2 VIF supérieurs à 5. Celui
sur la variable représentant la part des logements sur-occupés et celui
sur le pourcentage de petits logements. Le seuil à retenir pour
considérer la présence de multicolinéarité ou non à l’aide du VIF ne
fait pas l’unanimité parmi les statisticiens. Dans notre exemple, nous
nous basons sur la démonstration de Farrar & Glauber qui préconise
un seuil de 5 (Farrar & Glauber, 1967). Nous choisissons donc de
sortir la variable renseignant la part de logements sur-occupés. Après
vérification sur ce nouveau set de variable, les VIF obtenus sont tous
inférieurs à 5, nous pouvons conclure en faveur d’une absence de
multicolinéarité entre nos 8 variables.
<<<<<<< HEAD
=======
>>>>>>> master
No variable from the 8 input variables has collinearity problem.
The linear correlation coefficients ranges between:
min correlation ( perc_tiny_log ~ perc_log_vac ): -0.141792
max correlation ( part_agri_nb_emploi ~ dens_pop ): -0.8051288
---------- VIFs of the remained variables --------
Variables VIF
1 prix_med 3.815959
2 perc_log_vac 2.257504
3 perc_maison 2.994347
4 perc_tiny_log 3.996999
5 dens_pop 2.024424
6 med_niveau_vis 1.829559
7 part_agri_nb_emploi 1.760249
8 part_cadre_profintellec_nbemploi 3.115098
<<<<<<< HEAD
5.1.3 KMO et
Sphéricité
Avant de factoriser nos données et de rechercher une structure
sous-jacente, il est nécessaire de vérifier la présence d’un minimun de
corrélation entre nos variables. Ce que nous avons fait précédemment. En
effet, dans le cas où les corrélations sont très faibles ou
inexistantes, il sera très difficile de faire émerger un ou des
facteurs. L’AFE ne sera donc probablement pas l’analyse à
conseiller.
Ensuite, il faut mesurer l’adéquation de l’échantillonnage. Cette
mesure donne un aperçu global de la qualité des corrélations inter-items
(inter-variables). Pour ce faire on va utiliser l’indice KMO. L’indice
KMO varie entre 0 et 1 et donne une information complémentaire à
l’examen de la matrice de corrélation. Cet indice est calculé pour
l’ensemble de nos variables, mais aussi pour chaque variable. Un KMO
élevé indique que les variables sont suffisamment corrélées pour
justifier l’utilisation de l’AFE. En revanche, un KMO bas suggère que
l’analyse factorielle pourrait ne pas être appropriée avec les données
fournies.
L’interprétation du KMO a été décrite par Kaiser en 1974 et se
décline ainsi (Kaiser, 1974) :
=======
5.1.3 Pré-requis à la
factorisation : KMO et Bartlett
Avant de factoriser nos données et de rechercher une structure
sous-jacente, il est nécessaire de vérifier la présence d’un minimun de
corrélation entre nos variables. Ce que nous avons fait précédemment
avec la matrice de corrélation. En effet, dans le cas où les
corrélations sont très faibles ou inexistantes, il sera très difficile
de faire émerger un ou des facteurs. L’AFE ne sera donc probablement pas
l’analyse à conseiller.
5.1.3.1 Indice
Kaiser-Meyer-Olkin (KMO)
Dans le cadre d’une anlyse factorielle il faut mesurer l’adéquation
de l’échantillonnage. Cette mesure donne un aperçu global de la qualité
des corrélations inter-items (inter-variables). Pour ce faire on va
utiliser l’indice Kaiser-Meyer-Olkin ou plus simplement appelé KMO
(Kaiser, H., F., 1974). L’indice KMO varie entre 0 et 1 et donne une
information complémentaire à l’examen de la matrice de corrélation. Cet
indice est calculé pour l’ensemble de nos variables, mais aussi pour
chaque variable. Un KMO élevé indique que les variables sont
suffisamment corrélées pour justifier l’utilisation de l’AFE (ou plus
largement d’une méthode d’analyse factorielle). En revanche, un KMO bas
suggère que l’analyse factorielle pourrait ne pas être appropriée avec
les données fournies.
L’interprétation du KMO a été décrite par Kaiser en 1974 et se
décline ainsi (Kaiser, H., F., 1974) :
>>>>>>> master
- 0.90 et plus : Merveilleux
- 0.80 et plus : Méritoire
- 0.70 et plus : Bien
- 0.60 et plus : Médiocre
- 0.50 et plus : Misérable
- Moins de 0.50 : Inacceptable
On peut tout-à-fait avoir le cas d’un KMO global élevé indiquant une
bonne adéquation générale, mais un KMO d’une variable en particulier
très mauvais. Dans ce cas de figure il faut examiner la variable pour
essayer de comprendre pourquoi son KMO est faible. Cela peut venir de
valeurs manquantes, d’une faible variance, ou encore d’une mauvaise
corrélation avec les autres variables. Cette variable peut empêcher au
modèle d’être mis en lumière correctement et provoquer du bruit. Il
faudrait donc envisager de la retirer du modèle.
<<<<<<< HEAD
=======
5.1.3.2 Test de
Bartlett
>>>>>>> master
Il faut également vérifier que notre matice de corrélation n’est pas
une matrice d’identité. C’est-à-dire une matrice de corrélation où
toutes nos variables sont parfaitement indépendantes, à savoir où toutes
les corrélations sont égales à 0. Pour celà nous utilisons le test de
sphéricité de Bartlett (Bartlett, M.S., 1937). Pour valider ce
pré-requis il est nécessaire que le test soit significatif (p < 0,05)
pour accepter l’idée que notre matrice de corrélation est
significativement différente d’une matrice d’identité.
Pour réaliser un KMO et le test de Bartlett on peut utiliser la
librairie psych avec les fonctions KMO() et
cortest.bartlett(). Une alternative intéressante est la
fonction check_factostructure() du package
performance, cette fonction réalise les deux tests et nous
indique si nos données sont appropriées pour réaliser une analyse
factorielle.
<<<<<<< HEAD
=======
>>>>>>> master
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = dfzpp)
Overall MSA = 0.81
MSA for each item =
prix_med perc_log_vac
0.76 0.74
perc_maison perc_tiny_log
0.81 0.78
dens_pop med_niveau_vis
0.88 0.76
part_agri_nb_emploi part_cadre_profintellec_nbemploi
0.90 0.84
<<<<<<< HEAD
=======
>>>>>>> master
$chisq
[1] 5827.853
$p.value
[1] 0
$df
[1] 28
<<<<<<< HEAD
=======
>>>>>>> master
# Is the data suitable for Factor Analysis?
- Sphericity: Bartlett's test of sphericity suggests that there is sufficient significant correlation in the data for factor analysis (Chisq(28) = 5827.85, p < .001).
- KMO: The Kaiser, Meyer, Olkin (KMO) overall measure of sampling adequacy suggests that data seems appropriate for factor analysis (KMO = 0.81). The individual KMO scores are: prix_med (0.76), perc_log_vac (0.74), perc_maison (0.81), perc_tiny_log (0.78), dens_pop (0.88), med_niveau_vis (0.76), part_agri_nb_emploi (0.90), part_cadre_profintellec_nbemploi (0.84).
Dans notre cas nous avons donc un KMO global méritoire (0.81) et des
KMO par variable satisfaisants. Le test de sphéricité nous indique que
notre matrice de corrélation n’est pas une matrice d’identité. Nous
pouvons donc nous lancer dans l’AFE!
<<<<<<< HEAD
=======
>>>>>>> master
5.2 Combien de facteurs
retenir ?
Lorsque l’on procède à une analyse factorielle il est très souvent
nécessaire de définir le nombre de composantes que l’on souhaite (pour
l’ACP) ou de facteurs latents (AFE) en amont. Cette décision repose sur
l’étude des valeures propres et il existe un grand nombre d’indices et
de méthodes (comme par exemple le coude de Katell, la règle de
Kaiser-Guttman…). Cependant, il n’existe pas de consensus sur quelle
méthode choisir et laquelle serait la plus appropriée selon les cas.
Makowski en 2018, propose de se reposer sur un consensus parmi les
méthodes plutôt que sur une méthode en particulier (Makowski, 2018). Il
implémente sa solution dans le packge psycho puis dans la
fonctionn_factors() dans le package
parameters. C’est ce que nous utiliserons ici pour définir
le nombre adéquat de facteurs à retenir pour notre analyse.
<<<<<<< HEAD
# Method Agreement Procedure:
The choice of 1 dimensions is supported by 4 (28.57%) methods out of 14 (t, p, Acceleration factor, Scree (R2)).
# Plus de détail peuvent être obtenu en pasant au format data frame et en utilisant summary()
nb_factor <- as.data.frame(n)
head(nb_factor)
=======
# Method Agreement Procedure:
The choice of 2 dimensions is supported by 6 (31.58%) methods out of 19 (Optimal coordinates, Parallel analysis, Kaiser criterion, Scree (SE), VSS complexity 2, Velicer's MAP).
# Plus de détail peuvent être obtenu en pasant au format data frame et en utilisant summary()
nb_factor <- as.data.frame(n)
head(nb_factor)
>>>>>>> master
n_Factors Method Family
1 1 t Multiple_regression
2 1 p Multiple_regression
3 1 Acceleration factor Scree
4 1 Scree (R2) Scree_SE
<<<<<<< HEAD
5 2 Optimal coordinates Scree
6 2 Parallel analysis Scree
n_Factors n_Methods
1 1 4
2 2 4
3 3 1
4 4 1
5 5 1
6 6 2
7 7 1
# On peut également représenter le nombre de facteurs.
library(see)
plot(n, type="line") + theme_modern()


=======
5 1 VSS complexity 1 VSS
6 2 Optimal coordinates Scree
n_Factors n_Methods Variance_Cumulative
1 1 5 0.5136409
2 2 6 0.6510016
3 3 1 0.6970123
4 4 3 0.7301025
5 5 1 0.7509842
6 6 2 0.7532000
7 7 1 0.7540760
# On peut également représenter le nombre de facteurs.
library(see)
plot(n, type="line") + theme_modern()


>>>>>>> master
Eigenvalues Proportion of Variance Cumulative Prop. Variance
Factor 1 4.80 0.60 0.60
Factor 2 1.41 0.18 0.78
Factor 3 0.56 0.07 0.85
Factor 4 0.42 0.05 0.90
Factor 5 0.28 0.03 0.93
Factor 6 0.26 0.03 0.97
Factor 7 0.15 0.02 0.98
Factor 8 0.13 0.02 1.00
<<<<<<< HEAD
Ici on voit très clairement qu’il est nécessaire de creuser un peu
plus loin. Les résultats bruts renvoient un seul facteur latent, ce qui
peut être tout à fait logique vu le petit nombre de variables que nous
avons. C’est aussi une des forces de l’AFE de pouvoir faire émerger un
seul facteur latent global au sein duquel se projeterait toutes nos
variables. C’est un résultat qui peut être très intéressant.
Toutefois, on voit également que 6 méthodes font également consensus
sur deux facteurs latents.
Ainsi quel est le meilleur modèle ?
=======
Ici les résultats bruts renvoient 2 facteurs latents. Mais 5
méthodes, ce qui est important, font également consensus autour d’un
seul facteur, ce qui peut être tout à fait logique vu le petit nombre de
variables que nous avons. C’est aussi une des forces de l’AFE de pouvoir
faire émerger un seul facteur latent global au sein duquel se
projeterait toutes nos variables. C’est un résultat qui peut être très
intéressant.
Il pourrait être très intéressant de creuser un peu plus loin. Mais
cela pose une question fondamentale : quel est le meilleur
modèle ?
>>>>>>> master
L’analyse factorielle confirmatoire que nous allons vous présenter
par la suite va nous permettre de décider. En attendant, nous pouvons
lancer les deux analyses !
Pour réaliser ces analyses il va falloir déterminer la méthode de
factorisation. C’est-à-dire définir sur quelle mesure on se base pour
extraire les facteurs de notre set de variables. Les méthodes les plus
courament utilisées sont celles qui se basent soit sur le maximum de
vraisemblance (maximum likelihood), soit sur les méthodes des moindres
carrés (pondérés ou non) (weighted or unweighted least square)
(Tabachnick, B. G., & Fidell, L. S., 2014). Dans notre exemple,
après observation des distributions de nos données, nous avons choisi de
réaliser nos analyses avec la méthode de factorisation du maximum de
vraisemblance robuste (mlr). Cette méthode permet d’optimiser le calcul
des distances et la version robuste est adaptée à des données non
normales (Kyriazos & Poga, 2023).
Aparte sur les rotations :
Afin de pouvoir interpréter plus facilement les résultats des
analyses factorielles, il est nécessaire de faire appel à une méthode de
rotation (au-delà de 2 facteurs). Le principe de la rotation n’est pas
de modifier les relations obtenues entre les variables observées et les
facteurs, mais d’améliorer la lisibilité des résultats.
Il existe deux familles de rotation. Les rotations orthogonales et
les rotations obliques. Les rotations orthogonales doivent être
privilégiées lorsque l’on émet l’hypothèse que les facteurs (ou
composantes) obtenus ne sont pas corrélés entre eux. Pour cette famille
de rotation l’interprétation va se centrer sur la relation de chaque
variable observée avec chaque facteur. Au contraire, les rotations
obliques devront être employées s’il est supposé que les facteurs
obtenus sont corrélés entre eux. Dans ce dernier cas, en plus de la
matrice de corrélation calculée pour les rotations orthogonales, une
matrice supplémentaire incluant les corrélations entre les facteurs va
être produite. Il est à noter qu’en SHS la plupart des factorisations
impliquent une corrélation entre les facteurs. Il est assez rare
d’obtenir des facteurs qui ne soient pas du tout corrélés dans ces
disciplines. C’est pourquoi dans notre exemple nous avons sélectionné
une méthode de rotation oblique promax.
5.3 Lancement des
AFE
1er modèle à un 1 facteur :
<<<<<<< HEAD
# Utilisation de mlr méthode considérée comme plus robuste même pour des données non-normales
# Pour avoir mlr il faut utiliser la syntaxe ci-dessous :
# Nous n'utilisons pas de méthode de rotation car nous testons la solution à 1 seul facteur
efa1immo <- lavaan::efa(dfzpp, nfactors = 1, estimator = "MLR")
print(efa1immo)
=======
# Utilisation de mlr méthode considérée comme plus robuste même pour des données non-normales
# Pour avoir mlr il faut utiliser la syntaxe ci-dessous :
# Nous n'utilisons pas de méthode de rotation car nous testons la solution à 1 seul facteur
efa1immo <- lavaan::efa(dfzpp, nfactors = 1, estimator = "MLR")
print(efa1immo)
>>>>>>> master
f1
prix_med 0.686*
perc_log_vac -0.447*
perc_maison -0.790*
perc_tiny_log 0.843*
dens_pop 0.703*
med_niveau_vis 0.438*
part_agri_nb_emploi -0.650*
part_cadre_profintellec_nbemploi 0.831*
Avec un seul facteur toutes nos variables corrèlent donc avec un
facteur latent. Dans notre cas on a toute une partie qui corrèle
positivement et l’autre négativement. Ainsi, le pourcentage de petit
logements, la part des cadres dans l’emploi, le prix median du m², la
densité de population et le niveau de vie médian corrèlent positivement
et à l’inverse, le pourcentage de maison, la part d’agriculteurs dans
l’emploi et le pourcentage de logements vacant corrèlent négativement.
Cela laisse à penser à une dichotomie qui serait ville / campagne. Ainsi
le facteur latent exprimé par nos huit variables qui caractérisent nos
EPCI, serait une dimension sur le niveau d’urbanité ou de ruralité.
L’avantage de l’AFE c’est qu’une fois le facteur latent identifié,
nous pouvons, pour chaque individu obenir un score sur ce facteur
latent. Dans notre exemple, vu la dimension spatiale des données il
faudrait ensuite les cartographier pour visualiser spatialement
l’information. L’intérêt des scores factoriels étant d’être ré-utilisés
soit dans des analyses complémentaires, soit directement pour comprendre
la structure de nos données. Dans notre cas, on pourrait s’en servir
pour définir un score d’urbanité et de ruralité puis le représenter
<<<<<<< HEAD
# Extraction des scores factoriels par observation
factor_scores_immo<-predict(efa1immo)
# Regardons les 5 premières lignes
head(factor_scores_immo, 5)
=======
# Extraction des scores factoriels par observation
factor_scores_immo<-predict(efa1immo)
# Regardons les 5 premières lignes
head(factor_scores_immo, 5)
>>>>>>> master
f1
[1,] 1.37802423
[2,] -0.22773769
[3,] 0.07818743
[4,] -0.05003235
[5,] -0.42494739
<<<<<<< HEAD
# Extraction des charges factorielles par variable
factor_loadings_immo <- efa1immo$loadings
# Afficher les charges factorielles
print(factor_loadings_immo)
=======
# Extraction des charges factorielles par variable
factor_loadings_immo <- efa1immo$loadings
# Afficher les charges factorielles
print(factor_loadings_immo)
>>>>>>> master
f1
prix_med 0.686
perc_log_vac -0.447
perc_maison -0.790
perc_tiny_log 0.843
dens_pop 0.703
med_niveau_vis 0.438
part_agri_nb_emploi -0.650
part_cadre_profintellec_nbemploi 0.831
Testons le modèle à deux facteurs !
<<<<<<< HEAD
# Utilisation de mlr méthode considérée comme plus robuste même pour données non-normales
# Utilisation d'une méthode de rotation promax car nous testons un modèle à2 facteurs
efa2immo <- lavaan::efa(dfzpp, nfactors = 2, estimator = "MLR", rotation = "promax")
loads2immo<-print(efa2immo)
=======
# Utilisation de mlr méthode considérée comme plus robuste même pour données non-normales
# Utilisation d'une méthode de rotation promax car nous testons un modèle à2 facteurs
efa2immo <- lavaan::efa(dfzpp, nfactors = 2, estimator = "MLR", rotation = "promax")
loads2immo<-print(efa2immo)
>>>>>>> master
f1 f2
prix_med 0.922
perc_log_vac -0.886 .
perc_maison . -0.680
perc_tiny_log . 1.088
dens_pop 0.679
med_niveau_vis 0.689
part_agri_nb_emploi . -0.425
part_cadre_profintellec_nbemploi . 0.720
<<<<<<< HEAD
=======
>>>>>>> master
[[1]]
f1 f2
prix_med 0.9218108 0.04752817
perc_log_vac -0.8864241 0.21359654
perc_maison -0.1861246 -0.67992319
perc_tiny_log -0.2061558 1.08843752
<<<<<<< HEAD
dens_pop 0.0253656 0.67856183
=======
dens_pop 0.0253656 0.67856182
>>>>>>> master
med_niveau_vis 0.6885109 -0.08577373
part_agri_nb_emploi -0.2532162 -0.42512873
part_cadre_profintellec_nbemploi 0.1123612 0.71993957
Cette structure à deux facteurs est également très intéressante, et a
permis de faire émerger en plus du facteur latent, qui serait
urbanité/ruralité, un autre facteur représentant le côut de la vie. Au
niveau de ce facteur on observe une corrélation positive avec le prix
médian de l’immobilier au m² et le niveau de vie médian, et négative
avec le pourcentage de logement vacant. Ainsi, les EPCI ayant un score
élevé sur ce facteur latent seraient les EPCI où le niveau de vie médian
et le prix de l’immobilier seraient le plus élévés.
Extraction des charges factorielles par variable :
<<<<<<< HEAD
factor_loadings_immo2 <- efa2immo$loadings
# Afficher les charges factorielles
print(factor_loadings_immo2)
=======
factor_loadings_immo2 <- efa2immo$loadings
# Afficher les charges factorielles
print(factor_loadings_immo2)
>>>>>>> master
f1 f2
prix_med 0.922 0.048
perc_log_vac -0.886 0.214
perc_maison -0.186 -0.680
perc_tiny_log -0.206 1.088
dens_pop 0.025 0.679
med_niveau_vis 0.689 -0.086
part_agri_nb_emploi -0.253 -0.425
part_cadre_profintellec_nbemploi 0.112 0.720
Une fois de plus nous pouvons extraire les scores de ces deux
facteurs latents de ce second modèle.
<<<<<<< HEAD
# Extraction des scores factoriels par observation
factor_scores_immo2<-predict(efa2immo)
# Regardons les 5 premières lignes
head(factor_scores_immo2, 5)
=======
# Extraction des scores factoriels par observation
factor_scores_immo2<-predict(efa2immo)
# Regardons les 5 premières lignes
head(factor_scores_immo2, 5)
>>>>>>> master
f1 f2
[1,] 1.1630309 1.7195533
[2,] 0.1358464 -0.3291296
[3,] -0.9112937 0.3642026
[4,] -0.1611307 -0.1211379
[5,] -0.3071902 -0.5258387
Il est tout à fait possible dans le cadre de l’AFE d’emprunter une
représentation classique de l’ACP (le scatter plot) pour représenter nos
variables et leurs charges factorielles. Cette représentation peut
s’avérer également utile pour mieux comprendre nos facteurs latents.
<<<<<<< HEAD
# Graphique
# Extraire les charges factorielles
factor_loadings_immo2 <- efa2immo$loadings
# transformer les charges factorielles dans un data frame
factor_loadings_dfimmo2 <- as.data.frame(factor_loadings_immo2)
# Renommer les colonnes
colnames(factor_loadings_dfimmo2) <- c("Factor", "Loading")
# Ajouter une variables pour identifier nos charges factorielles
factor_loadings_dfimmo2$Item <- rownames(factor_loadings_dfimmo2)
# charger ggplot2
library(ggplot2)
# Réaliser un graphique des charges factorielles
ggplot(factor_loadings_dfimmo2, aes(x = Factor, y = Loading, label = Item)) +
geom_point() +
geom_text(size = 3, hjust = -0.1) +
labs(x = "Factor", y = "Loading", title = "Factor Loadings Plot") +
theme_minimal()

=======
# Graphique
# Extraire les charges factorielles
factor_loadings_immo2 <- efa2immo$loadings
# transformer les charges factorielles dans un data frame
factor_loadings_dfimmo2 <- as.data.frame(factor_loadings_immo2)
# Renommer les colonnes
colnames(factor_loadings_dfimmo2) <- c("Factor", "Loading")
# Ajouter une variables pour identifier nos charges factorielles
factor_loadings_dfimmo2$Item <- rownames(factor_loadings_dfimmo2)
# charger ggplot2
library(ggplot2)
# Réaliser un graphique des charges factorielles
ggplot(factor_loadings_dfimmo2, aes(x = Factor, y = Loading, label = Item)) +
geom_point() +
geom_text(size = 3, hjust = -0.1) +
labs(x = "Factor", y = "Loading", title = "Factor Loadings Plot") +
theme_minimal()

>>>>>>> master
Les structures obtenues, suite aux analyses factorielles exploratoires
menées, s’ajustent-elles à nos données ? Quel est le meilleur modèle
celui à 1 ou 2 facteurs ? Afin de répondre à cette question et
d’éprouver notre modèle théorique sur notre échantillon, il est
nécessaire de réaliser des analyses factorielles confirmatoires.
6 L’Analyse factorielle
confirmatoire
L’analyse factorielle confirmatoire est une technique statistique
utilisée pour tester un modèle factoriel.
Un modèle factoriel est une représentation mathématique d’une
structure sous-jacente explicative des relations observées entre
plusieurs variables.
Si dans le cas de l’AFE les facteurs latents émergent de manière
exploratoire à partir des données, dans le cadre de l’analyse
factorielle confirmatoire il s’agira de tester au contraire un modèle
avec des hypothèses pré-établies sur nos facteurs latents. Nous allons
imposer une structure aux données et étudier dans quelle mesure les
<<<<<<< HEAD
données vont correspondre à cette structure prédéfinie.
=======
données vont correspondre à cette structure prédéfinie. Nous pourrons
ainsi, utiliser la CFA, entre autres pour vérifier la stabilité d’un
modèle dans le temps, vérifier des outils de mesure ou encore étudier
quels modèle semble le plus pertinent.
>>>>>>> master
C’est en ce sens que cette analyse est confirmatoire. Nous étudions
comment un modèle pré-établi dans le cadre d’une théorie, ou suite à une
première analyse statistique sur des données, est confirmée par les
données observées.
<<<<<<< HEAD
=======
LA CFA, se déroule en plusieurs étapes :
>>>>>>> master
1- Définir un modèle Préalable : Spécifier un modèle
factoriel a priori, indiquant la relation entre les variables observées
et les facteurs latents que nous supposons. Le modèle peut également
inclure des relations entre les facteurs latents.
2- Obtenir les estimations des paramètres : les différents
paramètres de l’analyse factorielle confirmatoire (charges factorielles,
covariances entre les facteurs latents…) sont estimés à l’aide de nos
données observées. L’objectif de l’analyse étant d’obtenir des
estimations qui maximisent l’ajustement entre les données observées et
le modèle.
3- Lire les critères d’ajustement : La qualité et
l’ajustement du modèle sont évalués en utilisant divers critères
statistiques évaluant la position du modèle entre un modèle nul (sans
aucun lien) et un modèle saturé (avec des liens très maximum partout).
Les indices utilisés sont notamment : le chi², le RMSEA, le CFI,
etc.
4- Interpréter les résultats : Les charges factorielles
indiquent la force et la direction de la relation entre chaque variable
observée et son facteur latent correspondant. A partir de ces
indications, nous pouvons interpréter les résultats et vérifier si la
structure obtenue est bien dans le même sens que celle envisagée.
5- Modifier le modèle : Si le modèle ne s’ajuste pas bien
(que les indices d’ajustement ne sont pas satisfaisants), des
modifications peuvent être apportées, comme la suppression ou l’ajout de
liens entre les facteurs et les variables observées, pour améliorer
l’ajustement. Attention toutefois à rester dans un cadre théorique
cohérent et ne pas tester des liens qui n’ont pas de sens.
Tout l’enjeu en cas de non ajustement du modèle va être de comprendre
et d’analyser pourquoi le modèle ne s’ajuste pas. Cela peut venir d’un
modèle théorique qui n’est pas adapté aux données observées ou à des
variations entre la première analyse, qui permet d’établir un premier
modèle, et sa confirmation via l’analyse factorielle confirmatoire.
L’analyse factorielle confirmatoire est donc un très bon complément à
l’AFE. Il est d’ailleurs très fréquent que ces deux méthodes soient
utilisées ensemble. C’est même plutôt recommandé, tels que l’argumentent
Flora & Flake dans un article paru en 2017 (Flora & Flake,
2017). Il est préférable de ne pas réaliser l’analyse factorielle
confirmatoire sur le même jeu de données que l’AFE pour éliminer toute
spécificité liée à l’échantillonnage. Néanmoins il est envisageable
d’utiliser une partie des données comme échantillon d’entrainement pour
identifier des facteurs latents (AFE) et l’autre partie comme
échantillon test pour tester le modèle (CFA). Pour réaliser efficacement
le duo AFE/AFC il est nécessaire d’avoir une base de données avec un
grand nombre d’individus surtout afin de permettre la création d’un
échantillon d’entrainement et de test suffisamment grand. Il est de
pratique courante de diviser un échantillon en deux parties de façon
aléatoire. Sur une première moitié sera alors réalisée l’AFE et sur la
seconde moitié l’AFC.
6.1 Quel modèle choisir
?
6.1.1 L’analyse
factorielle confirmatoire en pratique
L’analyse factorielle confirmatoire fait partie du champs des
équations structurelles, sa mise en oeuvre se fait très bien sur R.
L’avantage des équations structurelles c’est qu’à la manière de l’ACP
nous pourrons représenter graphiquement les modèles obtenus.
1- Etape 1 : partitionnement des données :
<<<<<<< HEAD
## En premier lien le partitionnement des data
partitions <- datawizard::data_partition(dfzpp, proportion = 0.5) # ici division du corpus eavec 50% des individus dasn l'échantillon d'entrainement
training <- partitions$p_0.5
test <- partitions$test
training$.row_id <- NULL
test$.row_id <- NULL
2- Etape 2 : Réalisation des AFE sur la partition
d’entrainement
# modèle à 1 facteur
efa1immo_F1 <- lavaan::efa(training, nfactors = 1, estimator = "MLR")
# modèle à 2 facteurs
efa2immo_F2 <- lavaan::efa(training, nfactors = 2, estimator = "MLR", rotation = "promax")
3- Etape 3 : Réaliser une analyse factorielle
confirmatoire
library(lavaan)
attach(test) # nécessaire à cause du package lavaan
# modèle à 1 facteur
model1F<- 'F1 =~ prix_med + perc_log_vac + perc_maison + perc_tiny_log + dens_pop + med_niveau_vis + part_agri_nb_emploi + part_cadre_profintellec_nbemploi'
fact_1immo <- cfa(model1F, std.lv=T, estimator="MLR", data=test)
# modèle à 2 facteurs
model2F<- 'F1 =~ prix_med + perc_log_vac + med_niveau_vis
F2 =~ perc_maison + perc_tiny_log + dens_pop + part_agri_nb_emploi + part_cadre_profintellec_nbemploi'
fact_2immo <- cfa(model2F, std.lv=T, estimator="MLR", data=test)
=======
## En premier lien le partitionnement des data
partitions <- datawizard::data_partition(dfzpp, proportion = 0.5) # ici division du corpus eavec 50% des individus dasn l'échantillon d'entrainement
training <- partitions$p_0.5
test <- partitions$test
training$.row_id <- NULL
test$.row_id <- NULL
2- Etape 2 : Réalisation des AFE sur la partition
d’entrainement
# modèle à 1 facteur
efa1immo_F1 <- lavaan::efa(training, nfactors = 1, estimator = "MLR")
# modèle à 2 facteurs
efa2immo_F2 <- lavaan::efa(training, nfactors = 2, estimator = "MLR", rotation = "promax")
3- Etape 3 : Réaliser une analyse factorielle
confirmatoire
library(lavaan)
attach(test) # nécessaire à cause du package lavaan
# modèle à 1 facteur
model1F<- 'F1 =~ prix_med + perc_log_vac + perc_maison + perc_tiny_log + dens_pop + med_niveau_vis + part_agri_nb_emploi + part_cadre_profintellec_nbemploi'
fact_1immo <- cfa(model1F, std.lv=T, estimator="MLR", data=test)
# modèle à 2 facteurs
model2F<- 'F1 =~ prix_med + perc_log_vac + med_niveau_vis
F2 =~ perc_maison + perc_tiny_log + dens_pop + part_agri_nb_emploi + part_cadre_profintellec_nbemploi'
fact_2immo <- cfa(model2F, std.lv=T, estimator="MLR", data=test)
>>>>>>> master
Etape 3 : étudier la convergence de nos deux
modèles
Attention les sorties d’un modèle d’analyse factorielle confirmatoire
sont nombreuses, nous les détaillons ici pour en avoir une première
lecture mais leurs analyses se feront véritablement à l’aide d’autres
fonctions. Il faut retenir que deux grandes étapes seront à évaluer :
l’adéquation de nos données au modèle proposé (avec la vérification des
<<<<<<< HEAD
indices d’ajustement au modèle) et si le modèle s’ajuste correctement
nous pourrons alors étudier la structure de celui-ci par la force et le
signe des saturations obtenues.
res_fact1immo <- summary(fact_1immo, standardized=T, modindices = T, fit.measures=T, rsquare=T)
# Pour voir les différents éléments qui composent notre summary de notre modèle
summary(res_fact1immo)
=======
indices d’ajustement au modèle) - on parle de modèle de mesure
- et si le modèle s’ajuste correctement nous pourrons alors étudier la
structure de celui-ci par la force et le signe des saturations obtenues
- on parle alors de modèle de structure.
res_fact1immo <- summary(fact_1immo, standardized=T, modindices = T, fit.measures=T, rsquare=T)
# Pour voir les différents éléments qui composent notre summary de notre modèle
summary(res_fact1immo)
>>>>>>> master
Length Class Mode
header 5 -none- list
optim 9 -none- list
data 2 -none- list
test 2 -none- list
fit 49 lavaan.vector numeric
<<<<<<< HEAD
pe 11 data.frame list
mi 8 lavaan.data.frame list
=======
pe 10 data.frame list
mi 8 lavaan.data.frame list
>>>>>>> master
- header : contient des éléments contextuels sur notre fonction
(version du package…) ainsi que les mesures d’ajustement si
fitMeasures=TRUE
- optim : liste d’information concernant l’optimisation du modèle
- data : des éléments sur nos données
- test : les résultats des différents tests
- fit : Résultats des différents test d’ajustement du modèle
- pe : les différents paramètres des relations au sein du modèle sous
la forme d’un data frame des facteurs latent et de la variance
<<<<<<< HEAD
- mi: si modindices=TRUE, il s’agit des suggestions proposées par la
foncions pour améliorer notre modèle
Voici donc la sortie brute de summary, on retrouve également les
R2
lavaan 0.6.16 ended normally after 20 iterations
=======
mi: si modindices=TRUE, il s’agit des suggestions proposées
par la fonction pour améliorer notre modèle.
ATTENTION cette option est à utiliser avec grandes précautions. L’idée
ici est bien de tester un modèle théorique pré-établi et donc chaque
modifications proposées qui seraient ajoutées au modèle final doit
pouvoir se justifier théoriquement. La corrélation de l’ensemble des
erreurs de mesure ensemble, comme c’est souvent proposé par cette
option, est difficile à justifier dans un modèle théorique pré-établi.
Voici donc la sortie brute de summary, on retrouve également les
R2
lavaan 0.6-19 ended normally after 22 iterations
>>>>>>> master
Estimator ML
Optimization method NLMINB
Number of model parameters 16
Number of observations 611
Model Test User Model:
Standard Scaled
<<<<<<< HEAD
Test Statistic 883.002 551.126
Degrees of freedom 20 20
P-value (Chi-square) 0.000 0.000
Scaling correction factor 1.602
=======
Test Statistic 923.457 567.102
Degrees of freedom 20 20
P-value (Chi-square) 0.000 0.000
Scaling correction factor 1.628
>>>>>>> master
Yuan-Bentler correction (Mplus variant)
Model Test Baseline Model:
<<<<<<< HEAD
Test statistic 2800.713 1396.950
Degrees of freedom 28 28
P-value 0.000 0.000
Scaling correction factor 2.005
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.689 0.612
Tucker-Lewis Index (TLI) 0.564 0.457
Robust Comparative Fit Index (CFI) 0.690
Robust Tucker-Lewis Index (TLI) 0.566
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -5655.633 -5655.633
Scaling correction factor 4.117
for the MLR correction
Loglikelihood unrestricted model (H1) -5214.132 -5214.132
Scaling correction factor 2.720
for the MLR correction
Akaike (AIC) 11343.266 11343.266
Bayesian (BIC) 11413.907 11413.907
Sample-size adjusted Bayesian (SABIC) 11363.111 11363.111
Root Mean Square Error of Approximation:
RMSEA 0.266 0.208
90 Percent confidence interval - lower 0.251 0.197
90 Percent confidence interval - upper 0.281 0.220
P-value H_0: RMSEA <= 0.050 0.000 0.000
P-value H_0: RMSEA >= 0.080 1.000 1.000
Robust RMSEA 0.264
90 Percent confidence interval - lower 0.245
90 Percent confidence interval - upper 0.283
=======
Test statistic 3084.675 1621.522
Degrees of freedom 28 28
P-value 0.000 0.000
Scaling correction factor 1.902
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.704 0.657
Tucker-Lewis Index (TLI) 0.586 0.519
Robust Comparative Fit Index (CFI) 0.706
Robust Tucker-Lewis Index (TLI) 0.589
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -5561.143 -5561.143
Scaling correction factor 3.466
for the MLR correction
Loglikelihood unrestricted model (H1) -5099.414 -5099.414
Scaling correction factor 2.445
for the MLR correction
Akaike (AIC) 11154.286 11154.286
Bayesian (BIC) 11224.928 11224.928
Sample-size adjusted Bayesian (SABIC) 11174.131 11174.131
Root Mean Square Error of Approximation:
RMSEA 0.272 0.212
90 Percent confidence interval - lower 0.257 0.200
90 Percent confidence interval - upper 0.287 0.223
P-value H_0: RMSEA <= 0.050 0.000 0.000
P-value H_0: RMSEA >= 0.080 1.000 1.000
Robust RMSEA 0.270
90 Percent confidence interval - lower 0.251
90 Percent confidence interval - upper 0.289
>>>>>>> master
P-value H_0: Robust RMSEA <= 0.050 0.000
P-value H_0: Robust RMSEA >= 0.080 1.000
Standardized Root Mean Square Residual:
<<<<<<< HEAD
SRMR 0.124 0.124
=======
SRMR 0.118 0.118
>>>>>>> master
Parameter Estimates:
Standard errors Sandwich
Information bread Observed
Observed information based on Hessian
Latent Variables:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
F1 =~
<<<<<<< HEAD
prix_med 0.610 0.045 13.525 0.000 0.610 0.654
perc_log_vac -0.410 0.044 -9.218 0.000 -0.410 -0.417
perc_maison -0.757 0.037 -20.182 0.000 -0.757 -0.781
perc_tiny_log 0.803 0.064 12.504 0.000 0.803 0.844
dens_pop 0.545 0.075 7.257 0.000 0.545 0.712
med_niveau_vis 0.357 0.050 7.103 0.000 0.357 0.384
part_gr_nb_mpl -0.653 0.037 -17.637 0.000 -0.653 -0.626
prt_cdr_prfnt_ 0.773 0.064 12.167 0.000 0.773 0.824
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.prix_med 0.499 0.075 6.673 0.000 0.499 0.573
.perc_log_vac 0.799 0.052 15.229 0.000 0.799 0.826
.perc_maison 0.367 0.047 7.788 0.000 0.367 0.390
.perc_tiny_log 0.261 0.033 7.809 0.000 0.261 0.288
.dens_pop 0.288 0.073 3.956 0.000 0.288 0.492
.med_niveau_vis 0.741 0.096 7.752 0.000 0.741 0.853
.part_gr_nb_mpl 0.661 0.088 7.552 0.000 0.661 0.608
.prt_cdr_prfnt_ 0.282 0.051 5.490 0.000 0.282 0.321
=======
prix_med 0.666 0.048 13.871 0.000 0.666 0.707
perc_log_vac -0.456 0.045 -10.030 0.000 -0.456 -0.468
perc_maison -0.789 0.041 -19.215 0.000 -0.789 -0.809
perc_tiny_log 0.858 0.063 13.556 0.000 0.858 0.859
dens_pop 0.495 0.064 7.789 0.000 0.495 0.729
med_niveau_vis 0.435 0.059 7.407 0.000 0.435 0.424
part_gr_nb_mpl -0.637 0.032 -19.827 0.000 -0.637 -0.648
prt_cdr_prfnt_ 0.823 0.062 13.325 0.000 0.823 0.817
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.prix_med 0.444 0.049 9.077 0.000 0.444 0.500
.perc_log_vac 0.741 0.048 15.550 0.000 0.741 0.781
.perc_maison 0.328 0.039 8.389 0.000 0.328 0.345
.perc_tiny_log 0.262 0.036 7.382 0.000 0.262 0.262
.dens_pop 0.216 0.051 4.251 0.000 0.216 0.469
.med_niveau_vis 0.863 0.114 7.589 0.000 0.863 0.820
.part_gr_nb_mpl 0.563 0.057 9.792 0.000 0.563 0.581
.prt_cdr_prfnt_ 0.338 0.048 6.974 0.000 0.338 0.333
>>>>>>> master
F1 1.000 1.000 1.000
R-Square:
Estimate
<<<<<<< HEAD
prix_med 0.427
perc_log_vac 0.174
perc_maison 0.610
perc_tiny_log 0.712
dens_pop 0.508
med_niveau_vis 0.147
part_gr_nb_mpl 0.392
prt_cdr_prfnt_ 0.679
=======
prix_med 0.500
perc_log_vac 0.219
perc_maison 0.655
perc_tiny_log 0.738
dens_pop 0.531
med_niveau_vis 0.180
part_gr_nb_mpl 0.419
prt_cdr_prfnt_ 0.667
>>>>>>> master
Modification Indices:
lhs op rhs mi epc
<<<<<<< HEAD
1 prix_med ~~ perc_log_vac 284.482 -0.457
2 prix_med ~~ perc_maison 42.846 -0.135
3 prix_med ~~ perc_tiny_log 96.378 -0.188
4 prix_med ~~ dens_pop 14.313 -0.066
5 prix_med ~~ med_niveau_vis 148.482 0.317
6 prix_med ~~ part_agri_nb_emploi 3.238 -0.046
7 prix_med ~~ part_cadre_profintellec_nbemploi 19.414 -0.084
8 perc_log_vac ~~ perc_maison 4.687 0.053
9 perc_log_vac ~~ perc_tiny_log 132.182 0.257
10 perc_log_vac ~~ dens_pop 3.035 0.037
11 perc_log_vac ~~ med_niveau_vis 70.752 -0.268
12 perc_log_vac ~~ part_agri_nb_emploi 5.183 0.071
13 perc_log_vac ~~ part_cadre_profintellec_nbemploi 14.426 0.086
14 perc_maison ~~ perc_tiny_log 30.445 -0.104
15 perc_maison ~~ dens_pop 6.599 0.042
16 perc_maison ~~ med_niveau_vis 11.288 0.079
17 perc_maison ~~ part_agri_nb_emploi 2.149 0.034
18 perc_maison ~~ part_cadre_profintellec_nbemploi 79.007 0.166
19 perc_tiny_log ~~ dens_pop 49.218 0.107
20 perc_tiny_log ~~ med_niveau_vis 75.760 -0.186
21 perc_tiny_log ~~ part_agri_nb_emploi 8.371 0.063
22 perc_tiny_log ~~ part_cadre_profintellec_nbemploi 45.506 0.124
23 dens_pop ~~ med_niveau_vis 23.428 -0.098
24 dens_pop ~~ part_agri_nb_emploi 31.546 0.112
25 dens_pop ~~ part_cadre_profintellec_nbemploi 13.468 0.056
26 med_niveau_vis ~~ part_agri_nb_emploi 7.646 -0.082
27 med_niveau_vis ~~ part_cadre_profintellec_nbemploi 9.536 0.067
28 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 9.182 -0.066
sepc.lv sepc.all sepc.nox
1 -0.457 -0.724 -0.724
2 -0.135 -0.316 -0.316
3 -0.188 -0.520 -0.520
4 -0.066 -0.174 -0.174
5 0.317 0.522 0.522
6 -0.046 -0.080 -0.080
7 -0.084 -0.225 -0.225
8 0.053 0.098 0.098
9 0.257 0.562 0.562
10 0.037 0.076 0.076
11 -0.268 -0.348 -0.348
12 0.071 0.097 0.097
13 0.086 0.180 0.180
14 -0.104 -0.337 -0.337
15 0.042 0.128 0.128
16 0.079 0.152 0.152
17 0.034 0.070 0.070
18 0.166 0.516 0.516
19 0.107 0.390 0.390
20 -0.186 -0.424 -0.424
21 0.063 0.151 0.151
22 0.124 0.455 0.455
23 -0.098 -0.211 -0.211
24 0.112 0.256 0.256
25 0.056 0.195 0.195
26 -0.082 -0.118 -0.118
27 0.067 0.146 0.146
28 -0.066 -0.153 -0.153
=======
1 prix_med ~~ perc_log_vac 280.382 -0.418
2 prix_med ~~ perc_maison 2.893 -0.032
3 prix_med ~~ perc_tiny_log 90.084 -0.176
4 prix_med ~~ dens_pop 9.173 -0.044
5 prix_med ~~ med_niveau_vis 192.810 0.372
6 prix_med ~~ part_agri_nb_emploi 1.587 -0.028
7 prix_med ~~ part_cadre_profintellec_nbemploi 4.958 -0.043
8 perc_log_vac ~~ perc_maison 2.046 -0.033
9 perc_log_vac ~~ perc_tiny_log 152.154 0.268
10 perc_log_vac ~~ dens_pop 4.556 0.037
11 perc_log_vac ~~ med_niveau_vis 74.469 -0.287
12 perc_log_vac ~~ part_agri_nb_emploi 23.104 0.133
13 perc_log_vac ~~ part_cadre_profintellec_nbemploi 4.396 0.049
14 perc_maison ~~ perc_tiny_log 101.598 -0.185
15 perc_maison ~~ dens_pop 3.005 0.023
16 perc_maison ~~ med_niveau_vis 22.454 0.116
17 perc_maison ~~ part_agri_nb_emploi 0.009 0.002
18 perc_maison ~~ part_cadre_profintellec_nbemploi 66.500 0.153
19 perc_tiny_log ~~ dens_pop 49.380 0.093
20 perc_tiny_log ~~ med_niveau_vis 100.209 -0.233
21 perc_tiny_log ~~ part_agri_nb_emploi 12.220 0.070
22 perc_tiny_log ~~ part_cadre_profintellec_nbemploi 21.143 0.087
23 dens_pop ~~ med_niveau_vis 24.475 -0.093
24 dens_pop ~~ part_agri_nb_emploi 19.608 0.070
25 dens_pop ~~ part_cadre_profintellec_nbemploi 4.914 0.031
26 med_niveau_vis ~~ part_agri_nb_emploi 6.315 -0.075
27 med_niveau_vis ~~ part_cadre_profintellec_nbemploi 16.626 0.102
28 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 11.370 -0.072
sepc.lv sepc.all sepc.nox
1 -0.418 -0.728 -0.728
2 -0.032 -0.085 -0.085
3 -0.176 -0.516 -0.516
4 -0.044 -0.141 -0.141
5 0.372 0.601 0.601
6 -0.028 -0.057 -0.057
7 -0.043 -0.112 -0.112
8 -0.033 -0.066 -0.066
9 0.268 0.608 0.608
10 0.037 0.094 0.094
11 -0.287 -0.358 -0.358
12 0.133 0.206 0.206
13 0.049 0.097 0.097
14 -0.185 -0.629 -0.629
15 0.023 0.087 0.087
16 0.116 0.217 0.217
17 0.002 0.005 0.005
18 0.153 0.459 0.459
19 0.093 0.389 0.389
20 -0.233 -0.490 -0.490
21 0.070 0.183 0.183
22 0.087 0.292 0.292
23 -0.093 -0.216 -0.216
24 0.070 0.201 0.201
25 0.031 0.113 0.113
26 -0.075 -0.107 -0.107
27 0.102 0.188 0.188
28 -0.072 -0.164 -0.164
>>>>>>> master
On peut également obtenir les saturations standardisées pour les deux
modèles, ce qui sera intéressant dans une perspective de compréhension
de la structure de la CFA, mais aussi de réutilisation dans des analyses
complémentaires (régressions…).
<<<<<<< HEAD
=======
>>>>>>> master
$type
[1] "standardized"
$cov
prx_md prc_l_ prc_ms prc_t_ dns_pp
prix_med 0.000
<<<<<<< HEAD
perc_log_vac -9.268 0.000
perc_maison -2.223 1.364 0.000
perc_tiny_log -16.062 15.697 -3.445 0.000
dens_pop -4.045 2.249 2.974 3.520 0.000
med_niveau_vis 6.998 -8.768 3.121 -12.096 -4.509
part_agri_nb_emploi -1.745 2.308 1.481 4.163 5.342
part_cadre_profintellec_nbemploi -4.948 4.343 11.011 2.769 1.519
=======
perc_log_vac -10.184 0.000
perc_maison -0.956 -1.133 0.000
perc_tiny_log -15.269 18.306 -4.081 0.000
dens_pop -2.784 2.417 1.525 3.458 0.000
med_niveau_vis 7.281 -8.507 3.612 -11.599 -4.034
part_agri_nb_emploi -1.204 4.081 0.100 4.134 3.721
part_cadre_profintellec_nbemploi -2.038 2.314 7.846 2.413 1.156
>>>>>>> master
md_nv_ prt_g__ prt_c__
prix_med
perc_log_vac
perc_maison
perc_tiny_log
dens_pop
med_niveau_vis 0.000
<<<<<<< HEAD
part_agri_nb_emploi -3.183 0.000
part_cadre_profintellec_nbemploi 2.354 -2.441 0.000
=======
part_agri_nb_emploi -2.813 0.000
part_cadre_profintellec_nbemploi 2.548 -3.055 0.000
>>>>>>> master
$type
[1] "standardized"
$cov
prx_md prc_l_ md_nv_ prc_ms prc_t_ dns_pp
prix_med 0.000
<<<<<<< HEAD
perc_log_vac -0.008 0.000
med_niveau_vis 0.441 -3.130 0.000
perc_maison -2.820 1.732 0.131 0.000
perc_tiny_log -8.153 5.891 -2.293 -1.915 0.000
dens_pop -1.697 0.979 -1.613 3.528 2.330 0.000
part_agri_nb_emploi -4.195 3.250 -4.628 2.165 4.834 4.615
part_cadre_profintellec_nbemploi -0.275 1.441 3.490 10.915 1.405 1.155
=======
perc_log_vac -0.128 0.000
med_niveau_vis 0.375 -3.793 0.000
perc_maison -2.025 0.579 0.896 0.000
perc_tiny_log -6.570 5.503 -2.919 -2.682 0.000
dens_pop -0.522 0.267 -1.508 3.874 1.835 0.000
part_agri_nb_emploi -4.473 5.730 -4.872 1.339 4.648 2.811
part_cadre_profintellec_nbemploi 1.541 -0.770 3.745 8.122 0.606 1.269
>>>>>>> master
prt_g__ prt_c__
prix_med
perc_log_vac
med_niveau_vis
perc_maison
perc_tiny_log
dens_pop
part_agri_nb_emploi 0.000
<<<<<<< HEAD
part_cadre_profintellec_nbemploi -3.027 0.000
=======
part_cadre_profintellec_nbemploi -4.109 0.000
>>>>>>> master
Etape 4 : Représenter les deux modèles :
Voici donc la représentation des équations structurelles,
représentations qui obéit à un certain nombre de codes visuels : les
rectangles renvoient aux variables observées, les ellipses aux variables
latentes, les doubles flèches associées aux rectangles et aux ellipses à
l’erreur de chaque variable. Les couleurs vertes et rouges renvoient au
signe de la corrélation et l’épaisseur à la force de la corrélation
entre les variables et les facteurs.
<<<<<<< HEAD
semPlot::semPaths(fact_1immo, "std",
sizeMan = 8, sizeInt = 8, sizeLat = 8,
edge.label.cex=0.8,
fade=FALSE)

semPlot::semPaths(fact_2immo, "std",
sizeMan = 8, sizeInt = 8, sizeLat = 8,
edge.label.cex=0.8,
fade=FALSE)

=======
semPlot::semPaths(fact_1immo, "std",
sizeMan = 8, sizeInt = 8, sizeLat = 8,
edge.label.cex=0.8,
fade=FALSE)

semPlot::semPaths(fact_2immo, "std",
sizeMan = 8, sizeInt = 8, sizeLat = 8,
edge.label.cex=0.8,
fade=FALSE)

>>>>>>> master
Etape 5 : Comparer nos deux modèles
Tout notre enjeu ici va être de comparer les deux modèles et de
choisir celui qui s’ajuste le mieux à nos données. Pour ce faire nous
pouvons comparer les deux modèles sur différents indices.
<<<<<<< HEAD
# Pour comparer les modèles à l'aide des indices tel que l'AIC, le RMSEA, R2...
performance::compare_performance(fact_1immo, fact_2immo, verbose = FALSE)
=======
# Pour comparer les modèles à l'aide des indices tel que l'AIC, le RMSEA, R2...
performance::compare_performance(fact_1immo, fact_2immo, verbose = FALSE)
>>>>>>> master
# Comparison of Model Performance Indices
Name | Model | Chi2 | Chi2_df | p (Chi2) | Baseline(28) | p (Baseline) | GFI | AGFI | NFI | NNFI | CFI | RMSEA | RMSEA CI | p (RMSEA) | RMR | SRMR | RFI | PNFI | IFI | RNI | Loglikelihood | AIC (weights) | BIC (weights) | BIC_adjusted
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<<<<<<< HEAD
fact_1immo | lavaan | 883.002 | 20.000 | < .001 | 2800.713 | < .001 | 0.727 | 0.509 | 0.685 | 0.564 | 0.689 | 0.266 | [0.25, 0.28] | < .001 | 0.111 | 0.124 | 0.559 | 0.489 | 0.690 | 0.689 | -5655.633 | 11343.3 (<.001) | 11413.9 (<.001) | 11363.111
fact_2immo | lavaan | 356.542 | 19.000 | < .001 | 2800.713 | < .001 | 0.875 | 0.764 | 0.873 | 0.821 | 0.878 | 0.171 | [0.16, 0.19] | < .001 | 0.064 | 0.069 | 0.812 | 0.592 | 0.879 | 0.878 | -5392.403 | 10818.8 (>.999) | 10893.9 (>.999) | 10839.891
Name Value Threshold Interpretation
1 GFI 0.7273569 0.95 poor
2 AGFI 0.5092424 0.90 poor
3 NFI 0.6847225 0.90 poor
4 NNFI 0.5642526 0.90 poor
5 CFI 0.6887519 0.90 poor
6 RMSEA 0.2657482 0.05 poor
7 SRMR 0.1236643 0.08 poor
8 RFI 0.5586115 0.90 poor
9 PNFI 0.4890875 0.50 poor
10 IFI 0.6896473 0.90 poor
Name Value Threshold Interpretation
1 GFI 0.87525560 0.95 poor
2 AGFI 0.76364220 0.90 poor
3 NFI 0.87269600 0.90 poor
4 NNFI 0.82059800 0.90 poor
5 CFI 0.87826293 0.90 poor
6 RMSEA 0.17051654 0.05 poor
7 SRMR 0.06949247 0.08 satisfactory
8 RFI 0.81239411 0.90 poor
9 PNFI 0.59218657 0.50 satisfactory
10 IFI 0.87865680 0.90 poor
=======
fact_1immo | lavaan | 923.457 | 20.000 | < .001 | 3084.675 | < .001 | 0.720 | 0.496 | 0.701 | 0.586 | 0.704 | 0.272 | [0.26, 0.29] | < .001 | 0.111 | 0.118 | 0.581 | 0.500 | 0.705 | 0.704 | -5561.143 | 11154.3 (<.001) | 11224.9 (<.001) | 11174.131
fact_2immo | lavaan | 340.107 | 19.000 | < .001 | 3084.675 | < .001 | 0.877 | 0.767 | 0.890 | 0.845 | 0.895 | 0.166 | [0.15, 0.18] | < .001 | 0.065 | 0.068 | 0.838 | 0.604 | 0.895 | 0.895 | -5269.468 | 10572.9 (>.999) | 10648.0 (>.999) | 10594.021
Name Value Threshold Interpretation
1 GFI 0.7200403 0.95 poor
2 AGFI 0.4960726 0.90 poor
3 NFI 0.7006307 0.90 poor
4 NNFI 0.5862040 0.90 poor
5 CFI 0.7044314 0.90 poor
6 RMSEA 0.2719056 0.05 poor
7 SRMR 0.1177550 0.08 poor
8 RFI 0.5808829 0.90 poor
9 PNFI 0.5004505 0.50 satisfactory
10 IFI 0.7052030 0.90 poor
Name Value Threshold Interpretation
1 GFI 0.87694308 0.95 poor
2 AGFI 0.76683953 0.90 poor
3 NFI 0.88974294 0.90 poor
4 NNFI 0.84518779 0.90 poor
5 CFI 0.89494886 0.90 poor
6 RMSEA 0.16631354 0.05 poor
7 SRMR 0.06752027 0.08 satisfactory
8 RFI 0.83751591 0.90 poor
9 PNFI 0.60375414 0.50 satisfactory
10 IFI 0.89525726 0.90 poor
>>>>>>> master
Dans les deux configurations testées, l’analyse factorielle
confirmatoire présente un ajustement des modèles aux jeux de données
“test” plutôt mauvais. Pour le deuxième modèle toutefois, 2 indices sont
considérés comme satisfaisants et 3 indices ont des valeurs très proches
<<<<<<< HEAD
des seuils (NFI : 0.8853; CFI : 0.8904 ; IFI : 0.8907). Ces indices
indiquent l’écart entre un modèle nul (rien n’est lié) et un modèle
saturé (tout est lié avec des coefficients à 1). Le fait que ces indices
aient des valeurs de 0.88 ou 0.89 et non de 0.90 n’est pas
=======
des seuils (NFI : 0.8669; CFI : 0.8720 ; IFI : 0.8724). Ces indices
indiquent l’écart entre un modèle nul (rien n’est lié) et un modèle
saturé (tout est lié avec des coefficients à 1). Le fait que ces indices
aient des valeurs de 0.86 ou 0.87 et non de 0.90 n’est pas
>>>>>>> master
particulièrement problématique.
Concrètement, le deuxième modèle testé, avec 2 facteurs latents
permettrait de mieux rendre compte de la complexité de nos données.
Celui-ci s’ajustant le mieux à nos données.
La fonction interpret() donne des résultats pour 10
indices d’ajustement du modèle testé aux données de l’échantillon
présenté. Toutefois, ces différents indices ont été proposé au fur et à
mesure du développement des modèles en équations structurelles et, s’ils
ne testent pas exactement la même chose, ils permettent de rendre compte
de l’ajustement d’un modèle aux données présentées. Il n’est pas
nécessaire que l’ensemble des indices présentés soient satisfaisant pour
envisager un bon ajustement. Dans la littérature, certains indices sont
sélectionnés et tous ne sont pas présentés. De plus, une utilisation
trop contrainte des seuils augmente la probabilité de faux négatifs,
c’est-à-dire de considérer qu’un modèle ne s’ajusterait pas aux données
alors que si (Hooper et al., 2008). Prenons l’exemple d’un indice très
cité et présenté dans la littérature tel que le CFI Comparative
Fit Indice. Que fait-il exactement ? Il compare le modèle
d’intérêt avec un modèle restreint qui sert de base. Itération de
modèles entre le pire (modèle nul – à 0) et le parfait (voir modèle
saturé - 1) et le CFI indique où se situe le modèle d’intérêt (le notre)
sur ce continuum. Le seuil communément accepté de .95 indique une
réduction de l’erreur, par rapport au modèle nul, de 95%. Le modèle nul
étant un modèle où toutes les relations entre les variables sont
rapportées à 0. Donc en gros notre modèle s’ajuste à nos données avec un
risque de 5% que ce soit du au hasard. Quel que soit le contexte on est
satisfait d’avoir une réduction de l’erreur de 95%. Donc plus le seuil
est inférieur à .95, plus le risque que l’ajustement soit du au hasard
augmente. (Van Laar, S., & Braeken, J., 2021).
Le package Lavaan, fait également quelques propositions pour
améliorer notre modèle. Théoriquement, en tenant compte de toutes ces
propositions, le modèle s’ajusterait parfaitment, mais on serait dans un
cas évident de sur-ajustement aux données. En revanche, cela peut être
intéressant d’en prendre connaissance afin de vérifier qu’aucune
relation n’ait été oubliée et qui permettrait d’améliorer
significativement le modèle. Cette relation doit bien évidemment faire
sens théoriquement. La syntaxe utilisée est celle du package lavaan, on
peut en trouver une traduction ici
<<<<<<< HEAD
lhs op rhs mi epc
1 prix_med ~~ perc_log_vac 284.482 -0.457
2 prix_med ~~ med_niveau_vis 148.482 0.317
3 perc_log_vac ~~ perc_tiny_log 132.182 0.257
4 prix_med ~~ perc_tiny_log 96.378 -0.188
5 perc_maison ~~ part_cadre_profintellec_nbemploi 79.007 0.166
6 perc_tiny_log ~~ med_niveau_vis 75.760 -0.186
7 perc_log_vac ~~ med_niveau_vis 70.752 -0.268
8 perc_tiny_log ~~ dens_pop 49.218 0.107
9 perc_tiny_log ~~ part_cadre_profintellec_nbemploi 45.506 0.124
10 prix_med ~~ perc_maison 42.846 -0.135
11 dens_pop ~~ part_agri_nb_emploi 31.546 0.112
12 perc_maison ~~ perc_tiny_log 30.445 -0.104
13 dens_pop ~~ med_niveau_vis 23.428 -0.098
14 prix_med ~~ part_cadre_profintellec_nbemploi 19.414 -0.084
15 perc_log_vac ~~ part_cadre_profintellec_nbemploi 14.426 0.086
16 prix_med ~~ dens_pop 14.313 -0.066
17 dens_pop ~~ part_cadre_profintellec_nbemploi 13.468 0.056
18 perc_maison ~~ med_niveau_vis 11.288 0.079
19 med_niveau_vis ~~ part_cadre_profintellec_nbemploi 9.536 0.067
20 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 9.182 -0.066
sepc.lv sepc.all sepc.nox
1 -0.457 -0.724 -0.724
2 0.317 0.522 0.522
3 0.257 0.562 0.562
4 -0.188 -0.520 -0.520
5 0.166 0.516 0.516
6 -0.186 -0.424 -0.424
7 -0.268 -0.348 -0.348
8 0.107 0.390 0.390
9 0.124 0.455 0.455
10 -0.135 -0.316 -0.316
11 0.112 0.256 0.256
12 -0.104 -0.337 -0.337
13 -0.098 -0.211 -0.211
14 -0.084 -0.225 -0.225
15 0.086 0.180 0.180
16 -0.066 -0.174 -0.174
17 0.056 0.195 0.195
18 0.079 0.152 0.152
19 0.067 0.146 0.146
20 -0.066 -0.153 -0.153
lhs op rhs mi epc
1 F1 =~ perc_maison 91.820 -0.303
2 prix_med ~~ perc_maison 72.182 -0.121
3 perc_maison ~~ part_cadre_profintellec_nbemploi 62.761 0.148
4 med_niveau_vis ~~ part_cadre_profintellec_nbemploi 58.246 0.141
5 F1 =~ perc_tiny_log 56.384 -0.209
6 perc_log_vac ~~ perc_tiny_log 31.105 0.085
7 med_niveau_vis ~~ perc_maison 26.145 0.105
8 dens_pop ~~ part_agri_nb_emploi 25.670 0.100
9 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 19.694 -0.097
10 perc_tiny_log ~~ part_agri_nb_emploi 18.027 0.089
11 prix_med ~~ part_cadre_profintellec_nbemploi 16.107 -0.052
12 perc_tiny_log ~~ dens_pop 14.588 0.057
13 F2 =~ prix_med 12.875 -0.245
14 perc_log_vac ~~ med_niveau_vis 12.875 -0.103
15 F1 =~ part_agri_nb_emploi 12.058 -0.139
16 prix_med ~~ med_niveau_vis 11.464 -0.144
17 F2 =~ perc_log_vac 11.463 -0.159
18 med_niveau_vis ~~ part_agri_nb_emploi 10.530 -0.086
19 perc_maison ~~ dens_pop 10.252 0.051
20 med_niveau_vis ~~ perc_tiny_log 9.682 -0.053
sepc.lv sepc.all sepc.nox
1 -0.303 -0.312 -0.312
2 -0.121 -0.661 -0.661
3 0.148 0.451 0.451
4 0.141 0.337 0.337
5 -0.209 -0.219 -0.219
6 0.085 0.275 0.275
7 0.105 0.218 0.218
8 0.100 0.229 0.229
9 -0.097 -0.217 -0.217
10 0.089 0.247 0.247
11 -0.052 -0.326 -0.326
12 0.057 0.253 0.253
13 -0.245 -0.262 -0.262
14 -0.103 -0.183 -0.183
15 -0.139 -0.134 -0.134
16 -0.144 -0.613 -0.613
17 -0.159 -0.162 -0.162
18 -0.086 -0.132 -0.132
19 0.051 0.159 0.159
20 -0.053 -0.156 -0.156
6.2 2ème exemple :
étudier la variation dans le temps d’un modèle
Un usage pertinent du couple AFE/AFC peut être d’étudier la
permanence d’un phénomène. Ainsi, on peut utiliser l’AFE dans un premier
temps pour faire émerger un modèle et vérifier dans un second temps avec
l’analyse factorielle confirmatoire si le modèle est resté le même.
Dans cet article, nous venons de mettre en pratique le couple AFE/AFC
dans le cadre d’une première approche afin de sélectionner le meilleur
modèle factoriel. Voyons à présent si un modèle produit à l’aide d’une
AFE, sur des données de 2011, se confirme sur des données de 2023. Ceci
nous permettra de mettre en évidence ou non la permanence des phénomènes
en présence.
Nous utiliserons des données issue de l’INED dans un premier temps
sur le cru 2011
- PAYS : Les différents pays du monde
- Superf : Superficie des différents pays en km²
- Pop : Nombre d’habitants en 2011
- tx_natalite : Le taux de natalité est le rapport du nombre de
naissances vivantes de l’année à la population totale moyenne de
l’année
- tx_mortalite : Le taux de mortalité est le rapport du nombre de
décès de l’année à la population totale moyenne de l’année
- pop2050 : Projection du nombre d’habitants en 2050
- tx_mort_infantile : Nombre de décès d’enfants de moins d’un an
rapporté au nombre de naissances vivantes
- indice_fecond : Le nombre d’enfants nés vivants des femmes d’un âge
donné (ou d’une tranche d’âge) au cours de l’année, rapporté à la
population moyenne de l’année des femmes de même âge (ou de la même
classe d’âge) indique le taux de fécondité. L’indice de fécondité est la
somme des taux de fécondité par âge d’une année.
- moins15 : Le nombre d’habitants de moins de 15 ans
- plus65 : Le nombre d’habitants de plus de 65 ans
- espvie_homme : Age moyen de décès atteint par les hommes en
2011
- espvie_femme : Age moyen de décès atteint par les femmes en
2011
- RNB_hab : Revenu National Brut rapporté au nombre d’habitants
6.2.1 Préparation des
données
library(here)
csv_path <- here("data", "pop_societe_2011.csv")
pop2011 <- read.csv2(csv_path, row.names=1)
### Centrer et réduire les variables
dfz_2011 <- data.frame(scale(pop2011, center=T, scale=T))
Nous ne présenterons pas les statistiques descriptives dans cet
exemple afin de ne pas allourdir la lecture de cet article, toutefois,
elles ont bien été vérifiées par les auteurs.
Vérification des outliers et de la multicolinéarité : Nous faisons le
choix ici d’être plus stricte concernant les outliers et les variables
multicolinéaires. Cela comme précédemment, doit être assumé et justifié
lors de l’analyse.
6.2.2 Nettoyage des
données
Etape 1 : les outliers
# Multioutliers
#MCD avec le package rrcov
library(rrcov)
# 1- calcul de la distance MCD
mcd_result_2011 <- CovMcd(dfz_2011, alpha=0.75)
# 2- visualisation des outliers
plot(mcd_result_2011, which="all")




# suppression des valeurs manquantes
dfz_2011out<-cbind(dfz_2011, mcd_result_2011$wt)
dfz_2011outp<-subset(dfz_2011out, mcd_result_2011$wt %in% c(0,1))
# fusion de la base initiale et des distances de mahalanobis robustes
dfz_2011mah<-cbind(dfz_2011outp, mcd_result_2011$raw.mah)
# 3- suppression des outliers
dfz_2011p<-subset(dfz_2011mah, dfz_2011mah$`mcd_result_2011$raw.mah`< 100)
# On recalcule la distance de mahalanobis robuste sur notre base de données sans les premiers outliers, pour voir s'il en reste
dfz_2011_B<-subset(dfz_2011p, select = -c(`mcd_result_2011$raw.mah`, `mcd_result_2011$wt`))
# 1- calcul de la distance MCD
mcd_result_2011_2 <- CovMcd(dfz_2011_B, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
plot(mcd_result_2011_2, which="all")




15 outliers ont été supprimé avec le calcul de la distance de
mahalanobis robuste. La suppression des outliers a été réalisée suite au
calcul de la distance de mahalanobis robuste où le seuil de 100 comprend
les valeurs les plus éloignées. L’objectif est de sortir de l’analyse
les individus statistiques les plus porteurs de biais, néanmoins pour
conserver du sens dans notre base de données nous ne supprimons pas tous
les outliers relevé par la fonction, d’où le choix du seuil de 100. Ce
seuil a été déterminé suite à différentes itérations sur notre jeux de
données. Il sera donc différent avec d’autres données.
A présent aucune observation ne semble se détacher fortement des
autres. Notre base de données compte maintenant 158 pays (sans la Chine,
l’Inde, les Etats-Unis, le Canada, l’Australie, la Russie et bien
d’autres…).
Etape 2 : la multicolinéarité
# corrélations
cor <- correlation(dfz_2011_B, method = "spearman")
cor %>%
summary(redundant = FALSE)
# Correlation Matrix (spearman-method)
Parameter | RNB_hab | espvie_femme | espvie_homme | plus65 | moins15 | indice_fecond | tx_mort_infantile | pop2050 | tx_mortalite | tx_natalite | Pop
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Superf | -0.20 | -0.25* | -0.24 | -0.20 | 0.24 | 0.27* | 0.27* | 0.77*** | 0.14 | 0.27* | 0.74***
Pop | -0.09 | -0.04 | -0.05 | -0.02 | 0.07 | 0.07 | 0.07 | 0.98*** | 0.09 | 0.07 |
tx_natalite | -0.83*** | -0.86*** | -0.77*** | -0.92*** | 0.97*** | 0.98*** | 0.89*** | 0.25* | 0.13 | |
tx_mortalite | -0.22 | -0.38*** | -0.51*** | 6.83e-03 | 0.10 | 0.16 | 0.27* | 0.12 | | |
pop2050 | -0.23 | -0.18 | -0.18 | -0.19 | 0.24 | 0.25* | 0.23 | | | |
tx_mort_infantile | -0.87*** | -0.94*** | -0.89*** | -0.85*** | 0.90*** | 0.86*** | | | | |
indice_fecond | -0.80*** | -0.83*** | -0.74*** | -0.89*** | 0.96*** | | | | | |
moins15 | -0.84*** | -0.84*** | -0.76*** | -0.91*** | | | | | | |
plus65 | 0.77*** | 0.84*** | 0.74*** | | | | | | | |
espvie_homme | 0.82*** | 0.94*** | | | | | | | | |
espvie_femme | 0.85*** | | | | | | | | | |
p-value adjustment method: Holm (1979)
5 variables from the 12 input variables have collinearity problem:
tx_natalite espvie_homme espvie_femme moins15 pop2050
After excluding the collinear variables, the linear correlation coefficients ranges between:
min correlation ( plus65 ~ tx_mortalite ): 0.006826529
max correlation ( plus65 ~ indice_fecond ): -0.8874719
---------- VIFs of the remained variables --------
Variables VIF
1 Superf 1.502763
2 Pop 1.423677
3 tx_mortalite 4.108345
4 tx_mort_infantile 8.688467
5 indice_fecond 4.762499
6 plus65 6.947084
7 RNB_hab 2.292747
dfz2011_multi <- dfz_2011_B %>% select(-tx_natalite, -espvie_homme, -pop2050, -moins15, -tx_mortalite, -espvie_femme )
vifstep(dfz2011_multi, method = "spearman")
No variable from the 6 input variables has collinearity problem.
The linear correlation coefficients ranges between:
min correlation ( plus65 ~ Pop ): -0.0172211
max correlation ( plus65 ~ indice_fecond ): -0.8874719
---------- VIFs of the remained variables --------
Variables VIF
1 Superf 1.500557
2 Pop 1.405872
3 tx_mort_infantile 4.279781
4 indice_fecond 4.749530
5 plus65 2.757888
6 RNB_hab 2.078991
6.2.3 Réaliser l’AFE sur
les données 2011
Etape 1 : Déterminer le nombre de facteurs
# Regardons à présent en combien de facteurs latents se structurent nos variables
n <- n_factors(dfz2011_multi)
n
# Method Agreement Procedure:
The choice of 2 dimensions is supported by 8 (50.00%) methods out of 16 (Optimal coordinates, Acceleration factor, Parallel analysis, Kaiser criterion, Scree (SE), VSS complexity 1, BIC, BIC (adjusted)).

Etape 2 : Vérifier le KMO et la sphéracité
# Is the data suitable for Factor Analysis?
- Sphericity: Bartlett's test of sphericity suggests that there is sufficient significant correlation in the data for factor analysis (Chisq(15) = 504.50, p < .001).
- KMO: The Kaiser, Meyer, Olkin (KMO) overall measure of sampling adequacy suggests that data seems appropriate for factor analysis (KMO = 0.72). The individual KMO scores are: Superf (0.56), Pop (0.45*), tx_mort_infantile (0.73), indice_fecond (0.72), plus65 (0.80), RNB_hab (0.82).
Etape 3 : Réaliser l’AFE
# efa
efa_2011 <- lavaan::efa(dfz2011_multi, nfactors = 2, rotation="promax", estimator="MLR")
efa_2011
f1 f2
Superf 0.988
Pop 0.533 .
tx_mort_infantile 0.903
indice_fecond 0.945
plus65 -0.759
RNB_hab -0.668
Nous avons donc deux facteurs latents. Un premier qui corrèle
positivement avec la surface et la population, et un deuxième facteur
latent qui oppose d’un côté score élevé sur la mortalité infantile et
indice de fécondité avec de l’autre la proportion d’habitant de plus de
65 ans et et le revenu national brut par habitant.
6.2.4 2ème temps
L’analyse factorielle confirmatoire
Testons si la structure factorielle obtenue grâce à l’AFE se retrouve
sur les données de 2023. Si c’est le cas cela implique une permanence en
2023 du phénomène étudié en 2011.
Etape 1 : Chargement et préparation des données
# Charger les données
library(here)
csv_path <- here("data", "data_monde_afe_02.csv")
pop2023 <- read.csv2(csv_path, row.names=1)
pop2023p<-subset(pop2023, select = c(Superf, Pop, tx_mort_infantile, indice_fecond, RNB_hab, plus65))
### Centrer et réduire les variables
dfz_2023 <- data.frame(scale(pop2023p, center=T, scale=T))
# Multioutliers
# MCD avec le package rrcov
library(rrcov)
# 1- calcul de la distance MCD
mcd_result_2023 <- CovMcd(dfz_2023, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
plot(mcd_result_2023, which="all")




# suppression des valeurs manquantes
dfz_2023out<-cbind(dfz_2023, mcd_result_2023$wt)
dfz_2023outp<-subset(dfz_2023out, mcd_result_2023$wt %in% c(0,1))
# fusion de la base initiale et des distances de mahalanobis robustes
dfz_2023mah<-cbind(dfz_2023outp, mcd_result_2023$raw.mah)
# 3- suppression des outliers
dfz_2023p<-subset(dfz_2023mah, dfz_2023mah$`mcd_result_2023$raw.mah`< 100)
# On recalcule la distance de mahalanobis robuste sur notre base de données sans les premiers outliers, pour voir s'il en reste
dfz_2023_B<-subset(dfz_2023p, select = -c(`mcd_result_2023$raw.mah`, `mcd_result_2023$wt`))
# 1- calcul de la distance MCD
mcd_result_2023_2 <- CovMcd(dfz_2023_B, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
plot(mcd_result_2023_2, which="all")




# 14 outliers ont été supprimé avec le calcul de la distance de mahalanobis robuste. A présent aucune observation semble se détacher fortement des autres. Notre base de données compte maintenant 158 pays (sans la Chine, l'Inde, les Etats-Unis, le Canada, l'Australie, la Russie et bien d'autres...)
Globalement on retrouve les même outliers principaux (Chine, Russie,
Inde, Canada, Etats-Unis) avec malgré tout quelques variations. Pour
étudier la permanence dans le temps de notre phénomène nous avons donc
gardé les même variables qu’en 2011 pour permettre une comparaison entre
ces deux années.
Etape 2 : Réaliser la CFA
### Attacher car R refuse les $
attach(dfz_2023_B)
model23 <- 'F1 =~ Superf + Pop
F2 =~ indice_fecond + plus65 + RNB_hab'
library(lavaan)
fit23 <- cfa(model23, std.lv=T, estimator="MLR", data=dfz_2023_B)
effectsize::interpret(fit23)
Name Value Threshold Interpretation
1 GFI 0.96617198 0.95 satisfactory
2 AGFI 0.87314492 0.90 poor
3 NFI 0.95803658 0.90 satisfactory
4 NNFI 0.92359123 0.90 satisfactory
5 CFI 0.96943649 0.90 satisfactory
6 RMSEA 0.12442816 0.05 poor
7 SRMR 0.04451438 0.08 satisfactory
8 RFI 0.89509145 0.90 poor
9 PNFI 0.38321463 0.50 poor
10 IFI 0.97000943 0.90 satisfactory
semPlot::semPaths(fit23, "std",
sizeMan = 8, sizeInt = 8, sizeLat = 8,
edge.label.cex=0.8,
fade=FALSE)
Les indices de la CFA sont satisfaisants (6 sur 10, et 2 sont proches
des seuils), ce qui traduit une bonne adéquation du modèle à nos
données. La structure testée en 2011 sur certains pays se retrouve bien
en 2023. La distinction entre les pays étudiés se structure selon 2
facteurs : la superficie et la population d’une part et l’indice de
fécondité et la part des plus de 65 ans dans la population ainsi que le
RNB. Il est à noter que ce deuxième facteur rassemble des indices
contraires, c’est-à-dire que les pays ayant un fort taux de fécondité
sont aussi ceux qui ont une part des plus de 65 ans dans leur population
faible et un RNB bas.
Si les résultats ne sont pas révolutionnaires et que le nettoyage
préliminaire ne permet pas de leur attribuer une portée générale, nous
avons toutefois pu observer que le duo analyse factorielle exploratoire
et analyse factorielle confirmatoire permet de rendre compte de la
stabilité d’une structure d’un modèle théorique dans le temps.
6.3 Est-ce que je mesure
bien ce que je pense mesurer : l’exemple des tests psychométriques en
Psychologie
En Psychologie, un exemple classique de l’utilisation des couples
AFE/AFC concerne la validation des tests psychométriques. Afin de
réaliser des tests standardisés pour évaluer des processus
psychologiques, les psychologues ont recours à ce couple d’analyses
factorielles, en réalisant une analyse factorielle exploratoire sur un
premier échantillon et une analyse factorielle confirmatoire sur un
second échantillon (ayant tous 2 les mêmes caractéristiques).
Nous allons illustrer notre démarche avec l’utilisation d’un outil
psychométrique le Revised Paranormal Beliefs Scale - RPBS à
partir des données issues de l’article de Pennycook G, et al. 2020.
Le RPBS est un outil psychométrique utilisé afin de mesurer la
croyance des individus dans des phénomènes paranormaux. Habituellement
composé de 26 items répartis en 7 facteurs, la version utilisée dans
l’article présenté se décompose en 22 variables répartis en 6 facteurs
latents. Le facteur correspondant aux croyances religieuses
traditionnelles ayant été sorti de l’outil, avec les variables qui le
composent.
Les variables de notre base de données se répartissent comme ceci, un
exemple d’intitulé de variable est présenté entre parenthèses pour
chaque facteur :
- Phénomènes parapsychologiques (“Lire dans les pensées est
possible”) : PB_1, PB_7, PB_13, PB_19
- Sorcellerie (“Les sorciers existent”) : PB_2, PB_8, PB_14,
PB_20
- Superstition (“Les chats noirs portent malheur”) : PB_3,
PB_9, PB_15
- Spiritualité (“Il est possible de communiquer avec les
morts”) : PB_4, PB_10, PB_16, PB_21
- Formes de vie extraordinaires (“Le monstre du Loch Ness
existe”) : PB_5, PB_11, PB_17
- Précognition (“L’astrologie est une voie pertinente pour prédire
le futur”) : PB_6, PB_12, PB_18, PB_22
6.3.1 Préparation du jeu
de données
Charger le jeu de données et standardiser les variables
d’intérêt.
# Chargement des données de base
library(here)
csv_path <- here("data", "Study3_RPB.csv")
RPB <- read.csv2(csv_path, row.names=1)
# Sélection des 22 items :
RPBp<-subset(RPB, select = c("PB_1", "PB_2", "PB_3", "PB_4", "PB_5", "PB_6", "PB_7" ,"PB_8", "PB_9", "PB_10", "PB_11", "PB_12", "PB_13", "PB_14", "PB_15", "PB_16", "PB_17", "PB_18", "PB_19", "PB_20", "PB_21", "PB_22"))
# Conversion des variables en format numérique (car elles sont considérées comme catégorielles)
RPBpn <- as.data.frame(lapply(RPBp, as.numeric))
Nous allons débuter par partitionner notre jeu de données pour ne pas
exécuter l’AFE et l’AFC sur le même échantillon.
## En premier lien le partitionnement des data
partitions <- datawizard::data_partition(RPBpn, proportion = 0.5, seed = 424)
training <- partitions$p_0.5
test <- partitions$test
training$.row_id <- NULL
test$.row_id <- NULL
### Centrer et réduire les variables de nos 2 jeux de données
trainingz <- na.omit(data.frame(scale(training, center=T, scale=T)))
testz <- na.omit(data.frame(scale(test, center=T, scale=T)))
Nous avons vérifié les statistiques descriptives sur notre jeu de
données. Nous ne les présentons pas dans cet exemple pour plus de
lisibilité. Il est toutefois à noter qu’il n’y a pas de différence
statistiquement significative des scores obtenus sur chaque variable
pour nos deux échantillons training et test.
6.3.2 Nettoyage des
données
Etape 1 : les outliers
Identification et suppression des outliers sur nos deux jeux de
données test et training.
Multioutliers base training
# Multioutliers base training
#MCD avec le package rrcov
library(rrcov)
# 1- calcul de la distance MCD
mcd_RPBS1 <- CovMcd(trainingz, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
#plot(mcd_RPBS1, which="all")
# suppression des valeurs manquantes
trainingzout<-cbind(trainingz, mcd_RPBS1$wt)
trainingzoutp<-subset(trainingzout, mcd_RPBS1$wt %in% c(0,1))
# fusion de la base initiale et des distances de mahalanobis robustes
trainingzmah<-cbind(trainingzoutp, mcd_RPBS1$raw.mah)
# 3- suppression des outliers
trainingzp<-subset(trainingzmah, trainingzmah$`mcd_RPBS1$raw.mah`< 100)
# On recalcule la distance de mahalanobis robuste sur notre base de données sans les premiers outliers, pour voir s'il en reste
trainingz_B<-subset(trainingzp, select = -c(`mcd_RPBS1$raw.mah`, `mcd_RPBS1$wt`))
# 1- calcul de la distance MCD
mcd_RPBS1_2 <- CovMcd(trainingz_B, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
#plot(mcd_RPBS1_2, which="all")
Multioutliers base test
# Multioutliers base test
#MCD avec le package rrcov
# 1- calcul de la distance MCD
mcd_RPBS2 <- CovMcd(testz, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
#plot(mcd_RPBS2, which="all")
# suppression des valeurs manquantes
testzout<-cbind(testz, mcd_RPBS2$wt)
testzoutp<-subset(testzout, mcd_RPBS2$wt %in% c(0,1))
# fusion de la base initiale et des distances de mahalanobis robustes
testzmah<-cbind(testzoutp, mcd_RPBS2$raw.mah)
# 3- suppression des outliers
testzp<-subset(testzmah, testzmah$`mcd_RPBS2$raw.mah`< 100)
# On recalcule la distance de mahalanobis robuste sur notre base de données sans les premiers outliers, pour voir s'il en reste
testz_B<-subset(testzp, select = -c(`mcd_RPBS2$raw.mah`, `mcd_RPBS2$wt`))
# 1- calcul de la distance MCD
mcd_RPBS2_2 <- CovMcd(testz_B, alpha=0.75)
# L'objet `mcd_result` contient toutes les informations concernant le calcul sur notre base de données
# 2- visualisation des outliers
#plot(mcd_RPBS2_2, which="all")
# Aucun sujet ne se détache du groupe avec le calcul de la distance de Mahalanobis robuste dans chacune des 2 bases de données testées après les premières suppression. Nous ne supprimons pas de valeurs supplémentaires.
Notre jeu de données training comportait 6 outliers
et le jeu de données test en comportait 10. Nous les
avons donc supprimés. Tout comme l’exemple précédent, les outliers
entrainant le plus de biais ont été supprimés de notre jeu de données.
Le seuil de 100 a également été retenu suite à différentes itérations du
calcul de la distance de Mahalanobis robuste.
Etape 2 : la multicolinéarité
# corrélations
cor <- correlation(trainingz_B, method = "spearman")
cor %>%
summary(redundant = FALSE)
# Correlation Matrix (spearman-method)
Parameter | PB_22 | PB_21 | PB_20 | PB_19 | PB_18 | PB_17 | PB_16 | PB_15 | PB_14 | PB_13 | PB_12 | PB_11 | PB_10 | PB_9 | PB_8 | PB_7 | PB_6 | PB_5 | PB_4 | PB_3 | PB_2
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PB_1 | 0.59*** | 0.55*** | 0.46*** | 0.63*** | 0.61*** | 0.38*** | 0.44*** | 0.40*** | 0.64*** | 0.81*** | 0.48*** | 0.49*** | 0.61*** | 0.41*** | 0.47*** | 0.76*** | 0.51*** | 0.55*** | 0.62*** | 0.35*** | 0.54***
PB_2 | 0.52*** | 0.43*** | 0.72*** | 0.43*** | 0.44*** | 0.28*** | 0.32*** | 0.23*** | 0.56*** | 0.53*** | 0.32*** | 0.35*** | 0.48*** | 0.21*** | 0.68*** | 0.53*** | 0.35*** | 0.34*** | 0.46*** | 0.14* |
PB_3 | 0.19** | 0.28*** | 0.12* | 0.32*** | 0.29*** | 0.14* | 0.30*** | 0.66*** | 0.42*** | 0.34*** | 0.49*** | 0.28*** | 0.29*** | 0.69*** | 0.09 | 0.26*** | 0.49*** | 0.34*** | 0.21*** | |
PB_4 | 0.64*** | 0.64*** | 0.43*** | 0.57*** | 0.57*** | 0.52*** | 0.56*** | 0.30*** | 0.52*** | 0.66*** | 0.42*** | 0.41*** | 0.72*** | 0.32*** | 0.37*** | 0.59*** | 0.49*** | 0.43*** | | |
PB_5 | 0.33*** | 0.36*** | 0.33*** | 0.49*** | 0.35*** | 0.32*** | 0.31*** | 0.37*** | 0.45*** | 0.53*** | 0.39*** | 0.62*** | 0.35*** | 0.42*** | 0.36*** | 0.46*** | 0.44*** | | | |
PB_6 | 0.48*** | 0.55*** | 0.37*** | 0.53*** | 0.61*** | 0.40*** | 0.56*** | 0.56*** | 0.55*** | 0.54*** | 0.81*** | 0.44*** | 0.51*** | 0.59*** | 0.29*** | 0.50*** | | | | |
PB_7 | 0.59*** | 0.52*** | 0.50*** | 0.59*** | 0.59*** | 0.43*** | 0.47*** | 0.32*** | 0.59*** | 0.72*** | 0.43*** | 0.38*** | 0.58*** | 0.35*** | 0.47*** | | | | | |
PB_8 | 0.44*** | 0.35*** | 0.74*** | 0.40*** | 0.37*** | 0.22*** | 0.23*** | 0.15* | 0.53*** | 0.45*** | 0.25*** | 0.35*** | 0.41*** | 0.15* | | | | | | |
PB_9 | 0.22*** | 0.38*** | 0.18** | 0.39*** | 0.38*** | 0.18** | 0.37*** | 0.75*** | 0.49*** | 0.39*** | 0.64*** | 0.34*** | 0.34*** | | | | | | | |
PB_10 | 0.60*** | 0.59*** | 0.41*** | 0.56*** | 0.58*** | 0.40*** | 0.54*** | 0.33*** | 0.53*** | 0.61*** | 0.47*** | 0.40*** | | | | | | | | |
PB_11 | 0.35*** | 0.37*** | 0.36*** | 0.45*** | 0.31*** | 0.39*** | 0.30*** | 0.32*** | 0.43*** | 0.45*** | 0.45*** | | | | | | | | | |
PB_12 | 0.41*** | 0.44*** | 0.30*** | 0.48*** | 0.56*** | 0.29*** | 0.48*** | 0.57*** | 0.51*** | 0.52*** | | | | | | | | | | |
PB_13 | 0.60*** | 0.55*** | 0.47*** | 0.67*** | 0.55*** | 0.39*** | 0.49*** | 0.39*** | 0.65*** | | | | | | | | | | | |
PB_14 | 0.50*** | 0.52*** | 0.54*** | 0.61*** | 0.50*** | 0.32*** | 0.42*** | 0.44*** | | | | | | | | | | | | |
PB_15 | 0.19** | 0.31*** | 0.18** | 0.35*** | 0.33*** | 0.14* | 0.36*** | | | | | | | | | | | | | |
PB_16 | 0.52*** | 0.61*** | 0.29*** | 0.50*** | 0.47*** | 0.47*** | | | | | | | | | | | | | | |
PB_17 | 0.46*** | 0.43*** | 0.32*** | 0.43*** | 0.42*** | | | | | | | | | | | | | | | |
PB_18 | 0.70*** | 0.61*** | 0.45*** | 0.63*** | | | | | | | | | | | | | | | | |
PB_19 | 0.61*** | 0.53*** | 0.43*** | | | | | | | | | | | | | | | | | |
PB_20 | 0.52*** | 0.43*** | | | | | | | | | | | | | | | | | | |
PB_21 | 0.62*** | | | | | | | | | | | | | | | | | | | |
p-value adjustment method: Holm (1979)
# Correlation Matrix (spearman-method)
Parameter | PB_22 | PB_21 | PB_20 | PB_19 | PB_18 | PB_17 | PB_16 | PB_15 | PB_14 | PB_13 | PB_12 | PB_11 | PB_10 | PB_9 | PB_8 | PB_7 | PB_6 | PB_5 | PB_4 | PB_3 | PB_2
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PB_1 | 0.49*** | 0.55*** | 0.46*** | 0.61*** | 0.57*** | 0.38*** | 0.51*** | 0.37*** | 0.61*** | 0.76*** | 0.50*** | 0.51*** | 0.60*** | 0.46*** | 0.41*** | 0.77*** | 0.52*** | 0.53*** | 0.59*** | 0.38*** | 0.54***
PB_2 | 0.53*** | 0.57*** | 0.71*** | 0.56*** | 0.51*** | 0.45*** | 0.51*** | 0.35*** | 0.71*** | 0.58*** | 0.49*** | 0.44*** | 0.56*** | 0.39*** | 0.72*** | 0.58*** | 0.51*** | 0.46*** | 0.60*** | 0.28*** |
PB_3 | 0.22*** | 0.31*** | 0.23*** | 0.34*** | 0.37*** | 0.17*** | 0.30*** | 0.66*** | 0.42*** | 0.37*** | 0.54*** | 0.36*** | 0.30*** | 0.66*** | 0.20*** | 0.36*** | 0.46*** | 0.43*** | 0.35*** | |
PB_4 | 0.58*** | 0.62*** | 0.51*** | 0.59*** | 0.58*** | 0.54*** | 0.63*** | 0.35*** | 0.61*** | 0.66*** | 0.46*** | 0.45*** | 0.78*** | 0.38*** | 0.47*** | 0.63*** | 0.52*** | 0.45*** | | |
PB_5 | 0.39*** | 0.45*** | 0.39*** | 0.47*** | 0.46*** | 0.39*** | 0.40*** | 0.41*** | 0.49*** | 0.56*** | 0.46*** | 0.68*** | 0.42*** | 0.45*** | 0.40*** | 0.56*** | 0.46*** | | | |
PB_6 | 0.46*** | 0.59*** | 0.45*** | 0.53*** | 0.57*** | 0.38*** | 0.54*** | 0.49*** | 0.58*** | 0.57*** | 0.75*** | 0.43*** | 0.55*** | 0.54*** | 0.42*** | 0.54*** | | | | |
PB_7 | 0.55*** | 0.57*** | 0.49*** | 0.66*** | 0.61*** | 0.44*** | 0.50*** | 0.41*** | 0.65*** | 0.79*** | 0.53*** | 0.55*** | 0.62*** | 0.47*** | 0.43*** | | | | | |
PB_8 | 0.53*** | 0.49*** | 0.73*** | 0.47*** | 0.46*** | 0.36*** | 0.46*** | 0.24*** | 0.58*** | 0.45*** | 0.35*** | 0.33*** | 0.42*** | 0.31*** | | | | | | |
PB_9 | 0.30*** | 0.42*** | 0.35*** | 0.41*** | 0.44*** | 0.21*** | 0.44*** | 0.64*** | 0.59*** | 0.47*** | 0.62*** | 0.42*** | 0.37*** | | | | | | | |
PB_10 | 0.53*** | 0.60*** | 0.46*** | 0.60*** | 0.56*** | 0.53*** | 0.61*** | 0.33*** | 0.61*** | 0.66*** | 0.51*** | 0.42*** | | | | | | | | |
PB_11 | 0.36*** | 0.38*** | 0.36*** | 0.44*** | 0.44*** | 0.44*** | 0.33*** | 0.35*** | 0.56*** | 0.51*** | 0.45*** | | | | | | | | | |
PB_12 | 0.43*** | 0.51*** | 0.41*** | 0.53*** | 0.57*** | 0.32*** | 0.47*** | 0.57*** | 0.59*** | 0.53*** | | | | | | | | | | |
PB_13 | 0.53*** | 0.59*** | 0.48*** | 0.69*** | 0.58*** | 0.48*** | 0.52*** | 0.39*** | 0.65*** | | | | | | | | | | | |
PB_14 | 0.50*** | 0.57*** | 0.62*** | 0.58*** | 0.57*** | 0.45*** | 0.53*** | 0.38*** | | | | | | | | | | | | |
PB_15 | 0.28*** | 0.34*** | 0.26*** | 0.38*** | 0.37*** | 0.21*** | 0.32*** | | | | | | | | | | | | | |
PB_16 | 0.55*** | 0.67*** | 0.43*** | 0.53*** | 0.56*** | 0.44*** | | | | | | | | | | | | | | |
PB_17 | 0.43*** | 0.43*** | 0.37*** | 0.46*** | 0.45*** | | | | | | | | | | | | | | | |
PB_18 | 0.68*** | 0.59*** | 0.51*** | 0.59*** | | | | | | | | | | | | | | | | |
PB_19 | 0.60*** | 0.58*** | 0.46*** | | | | | | | | | | | | | | | | | |
PB_20 | 0.55*** | 0.54*** | | | | | | | | | | | | | | | | | | |
PB_21 | 0.58*** | | | | | | | | | | | | | | | | | | | |
p-value adjustment method: Holm (1979)
No variable from the 22 input variables has collinearity problem.
The linear correlation coefficients ranges between:
min correlation ( PB_8 ~ PB_3 ): 0.09464123
max correlation ( PB_13 ~ PB_1 ): 0.8141815
---------- VIFs of the remained variables --------
Variables VIF
1 PB_1 4.560558
2 PB_2 2.734096
3 PB_3 2.208149
4 PB_4 3.333450
5 PB_5 2.135252
6 PB_6 3.720740
7 PB_7 3.043448
8 PB_8 2.750028
9 PB_9 2.994793
10 PB_10 2.853347
11 PB_11 2.108972
12 PB_12 3.566169
13 PB_13 4.093647
14 PB_14 2.697757
15 PB_15 2.422444
16 PB_16 2.160766
17 PB_17 1.693175
18 PB_18 3.246472
19 PB_19 2.629454
20 PB_20 3.221506
21 PB_21 2.485992
22 PB_22 3.108305
No variable from the 22 input variables has collinearity problem.
The linear correlation coefficients ranges between:
min correlation ( PB_17 ~ PB_3 ): 0.1696088
max correlation ( PB_13 ~ PB_7 ): 0.7927911
---------- VIFs of the remained variables --------
Variables VIF
1 PB_1 3.249071
2 PB_2 3.455955
3 PB_3 2.302907
4 PB_4 3.436888
5 PB_5 2.232409
6 PB_6 2.764499
7 PB_7 3.908038
8 PB_8 2.816476
9 PB_9 2.757670
10 PB_10 3.227192
11 PB_11 2.229256
12 PB_12 2.835638
13 PB_13 4.070802
14 PB_14 3.390919
15 PB_15 2.227571
16 PB_16 2.544398
17 PB_17 1.714579
18 PB_18 2.745161
19 PB_19 2.647356
20 PB_20 3.014730
21 PB_21 2.686851
22 PB_22 2.546744
Aucun problème de multicolinéarité n’a été détecté, tous nos VIF sont
inférieurs à 5 pour nos 2 jeux de données.
Nous allons pouvoir procéder aux étapes suivantes.
6.3.3 Réalisons
l’AFE
Nos données sont-elles factorisables ? - KMO & Bartlett
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = trainingz_B)
Overall MSA = 0.94
MSA for each item =
PB_1 PB_2 PB_3 PB_4 PB_5 PB_6 PB_7 PB_8 PB_9 PB_10 PB_11 PB_12 PB_13
0.93 0.95 0.91 0.94 0.93 0.93 0.97 0.92 0.90 0.95 0.90 0.91 0.95
PB_14 PB_15 PB_16 PB_17 PB_18 PB_19 PB_20 PB_21 PB_22
0.97 0.92 0.95 0.94 0.93 0.97 0.91 0.96 0.96
$chisq
[1] 5995.078
$p.value
[1] 0
$df
[1] 231
# Is the data suitable for Factor Analysis?
- Sphericity: Bartlett's test of sphericity suggests that there is sufficient significant correlation in the data for factor analysis (Chisq(231) = 5995.08, p < .001).
- KMO: The Kaiser, Meyer, Olkin (KMO) overall measure of sampling adequacy suggests that data seems appropriate for factor analysis (KMO = 0.94). The individual KMO scores are: PB_1 (0.93), PB_2 (0.95), PB_3 (0.91), PB_4 (0.94), PB_5 (0.93), PB_6 (0.93), PB_7 (0.97), PB_8 (0.92), PB_9 (0.90), PB_10 (0.95), PB_11 (0.90), PB_12 (0.91), PB_13 (0.95), PB_14 (0.97), PB_15 (0.92), PB_16 (0.95), PB_17 (0.94), PB_18 (0.93), PB_19 (0.97), PB_20 (0.91), PB_21 (0.96), PB_22 (0.96).
Les indices de sphéricité et de KMO (merveilleux) indiquent que nos
données sont factorisables.
Procédons à l’AFE
# Method Agreement Procedure:
The choice of 4 dimensions is supported by 5 (26.32%) methods out of 19 (Bentler, beta, Optimal coordinates, Parallel analysis, Kaiser criterion).

#SCREE_PLOT(trainingz_B, corkind="spearman", verbose=T)
AFERP<-lavaan::efa(trainingz_B, nfactors = 4, estimator = "MLR")
AFERP
f1 f2 f3 f4
PB_1 0.936*
PB_2 0.785*
PB_3 . 0.704*
PB_4 0.307 0.640*
PB_5 0.523* .* .
PB_6 0.549* 0.536*
PB_7 0.617* . .
PB_8 0.952* .
PB_9 . 0.797*
PB_10 . 0.563*
PB_11 0.316 .* .
PB_12 0.610* 0.420*
PB_13 0.774* .
PB_14 0.355* .* 0.367*
PB_15 . 0.730*
PB_16 . . 0.748*
PB_17 0.584*
PB_18 . . 0.640*
PB_19 0.389* . 0.371*
PB_20 . 0.991*
PB_21 . 0.703*
PB_22 . 0.690*
Une structure en 4 facteurs est proposée avec l’analyse factorielle
exploratoire que nous venons de réaliser, et donc non en 6 comme
présenté dans l’article. Les estimate ont des valeurs comprises
entre 0.37 et 0.99 ce qui témoigne de liens assez forts avec la variable
latente.
6.3.4 Calcul de l’analyse
factorielle confirmatoire sur la base test
Vérifions si cette structure en 4 facteurs se retrouve sur notre
second jeu de données.
1 - Procédons à l’analyse factorielle
confirmatoire
library(lavaan)
attach(testz_B)
model <- 'F1 =~ PB_1 + PB_5 + PB_7 + PB_11 + PB_13 + PB_19
F2 =~ PB_3 + PB_9 + PB_12 + PB_15
F3 =~ PB_2 + PB_8 + PB_14 + PB_20
F4 =~ PB_4 + PB_6 + PB_10 + PB_16 + PB_17 + PB_18 + PB_21 + PB_22'
fit2 <- cfa (model, std.lv=T, estimator="MLR", data=testz_B)
2- Vérification de l’ajustement du modèle à nos
données
Name Value Threshold Interpretation
1 GFI 0.83347230 0.95 poor
2 AGFI 0.79245562 0.90 poor
3 NFI 0.86993845 0.90 poor
4 NNFI 0.88421239 0.90 poor
5 CFI 0.89824725 0.90 poor
6 RMSEA 0.09048906 0.05 poor
7 SRMR 0.06733462 0.08 satisfactory
8 RFI 0.85199893 0.90 poor
9 PNFI 0.76449137 0.50 satisfactory
10 IFI 0.89871145 0.90 poor
D’après un panel d’indices le modèle en 4 facteurs s’ajuste de façon
satisfaisante aux données (PNFI & SRMR) et de façon tendancielle
pour le NFI (0.869), le NNFI (0.884), le CFI (0.885) et l’IFI
(0.885).
3- Extraction des coefficients standardisés
Les coefficients traduisant le lien entre chaque variable et la
variable latente associée (les facteurs) sont plutôt élevés (entre 0.56
et 0.86) ce qui traduit des liens assez forts entre nos variables
observées et nos variables latentes.
4- Observation graphique de la structure obtenue
# On peut également représenter ce modèle :
semPlot::semPaths(fit2, "std",
sizeMan = 8, sizeInt = 8, sizeLat = 8,
edge.label.cex=0.8,
fade=FALSE)

La structure décrite dans l’article de Pennycook et al. 2020 n’est
pas retrouvée sur les données testées. Toutefois, une autre structure se
dégage et est stable sur nos deux échantillons, comme en témoignent les
résultats de nos analyses factorielles exploratoires et
confirmatoires.
L’article décrit une échelle en 22 items répartis en 6 catégories de
croyances aux phénomènes paranormaux, mais nous retrouvons une structure
en 4 facteurs avec les mêmes items sur les mêmes données. Ceci peut être
du a plusieurs éléments. Nous n’avons pas d’indication sur le traitement
des valeurs extrêmes de la part des auteurs de l’article. De plus, nous
n’avons pas d’éléments nous permettant d’affirmer qu’ils ont
effectivement partitionné leur jeu de données avant de procéder à leurs
analyses factorielles.
Un autre point à souligner, et pas des moindres, les auteurs n’ont
très certainement pas réalisé d’analyse factorielle exploratoire. En
effet, à partir du moment où un test psychométrique est validé,
c’est-à-dire qu’il a déjà été éprouvé par le couple AFE/AFC sur un jeu
de données assez conséquent, avec une population ayant les mêmes
caractéristiques, il n’est pas nécessaire de remettre en cause la
structure du test et nous pouvons directement procéder à une analyse
factorielle confirmatoire, afin de vérifier si le modèle alors
pré-établi par d’autres s’ajuste à nos données. Ceci est conseillé afin
de ne pas multiplier les tests statistiques et entraîner une inflation
des résultats faussements positifs (encore appelés erreur de type
II).
La structure obtenue en 4 facteurs reste cohérente avec la
proposition de départ en 6 facteurs. Certains regroupements restent
inchangés, d’autres voient quelques modifications (2 items sont
majoritairement reliés à un autre facteur latent que celui proposé dans
la structure initiale), mais la structure obtenue a du sens et peut
tout-à-fait servir de base de discussion à la construction d’outils
psychométriques sur le sujet. Pour information, avec notre nouvelle
structure nous obtenons la répartition suivante (en anglais) :
- F1 (Phénomènes parapsychologiques / Fomres de vie extraordinaires):
1. Some individuals are able to levitate (lift) objects through mental
forces. ; 5. The abominable snowman of Tibet exists. ; 7. Psychokinesis,
the movement of objects through psychic powers, does exist. ; 11. The
Loch Ness monster of Scotland exists. ; 13. A person’s thoughts can
influence the movement of a physical object. ; 19. Mind reading is not
possible
- F2 (Superstition + item 12 (qui était dans la structure initiale
relié majoritairement au facteur “Précognition”)) : 3. Black cats can
bring bad luck. ; 9. If you break a mirror, you will have bad luck. ;
12. The horoscope accurately tells a person’s future. ;
15. The number “13” is unlucky.
- F3 (Sorcellerie): 2. Black magic really exists. ; 8. Witches do
exist. ; 14. Through the use of formulas and incantations, it is
possible to cast spells on persons. ; 20. There are actual cases of
witchcraft.
- F4 (Spiritualité / Précognition - item12 + item17 (qui était dans la
struture initiale majoritairement relié au facteur latent “Formes de
vies extraordinaires”)): 4. Your mind or soul can leave your body and
travel (astral projection). ; 6. Astrology is a way to accurately
predict the future.; 10. During altered states, such as sleep or
trances, the spirit can leave the body.;
16. Reincarnation does occur. ; 17. There is life on other planets. ;
18. Some psychics can accurately predict the future.; 21. It is possible
to communicate with the dead. ; 22. Some people have an unexplained
ability to predict the future.
=======
lhs op rhs mi epc
1 prix_med ~~ perc_log_vac 280.382 -0.418
2 prix_med ~~ med_niveau_vis 192.810 0.372
3 perc_log_vac ~~ perc_tiny_log 152.154 0.268
4 perc_maison ~~ perc_tiny_log 101.598 -0.185
5 perc_tiny_log ~~ med_niveau_vis 100.209 -0.233
6 prix_med ~~ perc_tiny_log 90.084 -0.176
7 perc_log_vac ~~ med_niveau_vis 74.469 -0.287
8 perc_maison ~~ part_cadre_profintellec_nbemploi 66.500 0.153
9 perc_tiny_log ~~ dens_pop 49.380 0.093
10 dens_pop ~~ med_niveau_vis 24.475 -0.093
11 perc_log_vac ~~ part_agri_nb_emploi 23.104 0.133
12 perc_maison ~~ med_niveau_vis 22.454 0.116
13 perc_tiny_log ~~ part_cadre_profintellec_nbemploi 21.143 0.087
14 dens_pop ~~ part_agri_nb_emploi 19.608 0.070
15 med_niveau_vis ~~ part_cadre_profintellec_nbemploi 16.626 0.102
16 perc_tiny_log ~~ part_agri_nb_emploi 12.220 0.070
17 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 11.370 -0.072
18 prix_med ~~ dens_pop 9.173 -0.044
19 med_niveau_vis ~~ part_agri_nb_emploi 6.315 -0.075
20 prix_med ~~ part_cadre_profintellec_nbemploi 4.958 -0.043
sepc.lv sepc.all sepc.nox
1 -0.418 -0.728 -0.728
2 0.372 0.601 0.601
3 0.268 0.608 0.608
4 -0.185 -0.629 -0.629
5 -0.233 -0.490 -0.490
6 -0.176 -0.516 -0.516
7 -0.287 -0.358 -0.358
8 0.153 0.459 0.459
9 0.093 0.389 0.389
10 -0.093 -0.216 -0.216
11 0.133 0.206 0.206
12 0.116 0.217 0.217
13 0.087 0.292 0.292
14 0.070 0.201 0.201
15 0.102 0.188 0.188
16 0.070 0.183 0.183
17 -0.072 -0.164 -0.164
18 -0.044 -0.141 -0.141
19 -0.075 -0.107 -0.107
20 -0.043 -0.112 -0.112
lhs op rhs mi epc
1 med_niveau_vis ~~ part_cadre_profintellec_nbemploi 65.070 0.170
2 perc_maison ~~ part_cadre_profintellec_nbemploi 56.636 0.139
3 F1 =~ perc_tiny_log 44.716 -0.183
4 perc_log_vac ~~ perc_tiny_log 44.511 0.097
5 perc_log_vac ~~ part_agri_nb_emploi 43.073 0.142
6 F1 =~ perc_maison 32.818 -0.167
7 part_agri_nb_emploi ~~ part_cadre_profintellec_nbemploi 30.777 -0.122
8 prix_med ~~ perc_maison 29.347 -0.066
9 perc_maison ~~ perc_tiny_log 23.831 -0.092
10 perc_tiny_log ~~ part_agri_nb_emploi 23.239 0.092
11 med_niveau_vis ~~ perc_tiny_log 18.283 -0.073
12 med_niveau_vis ~~ part_agri_nb_emploi 15.982 -0.103
13 med_niveau_vis ~~ perc_maison 15.147 0.076
14 F2 =~ prix_med 14.438 -0.268
15 perc_log_vac ~~ med_niveau_vis 14.438 -0.112
16 perc_maison ~~ dens_pop 12.976 0.046
17 prix_med ~~ part_cadre_profintellec_nbemploi 11.994 -0.045
18 dens_pop ~~ part_agri_nb_emploi 10.148 0.051
19 perc_tiny_log ~~ dens_pop 9.344 0.039
20 prix_med ~~ part_agri_nb_emploi 8.306 0.045
sepc.lv sepc.all sepc.nox
1 0.170 0.337 0.337
2 0.139 0.414 0.414
3 -0.183 -0.183 -0.183
4 0.097 0.334 0.334
5 0.142 0.252 0.252
6 -0.167 -0.171 -0.171
7 -0.122 -0.256 -0.256
8 -0.066 -0.331 -0.331
9 -0.092 -0.412 -0.412
10 0.092 0.291 0.291
11 -0.073 -0.218 -0.218
12 -0.103 -0.158 -0.158
13 0.076 0.165 0.165
14 -0.268 -0.285 -0.285
15 -0.112 -0.188 -0.188
16 0.046 0.184 0.184
17 -0.045 -0.207 -0.207
18 0.051 0.142 0.142
19 0.039 0.211 0.211
20 0.045 0.160 0.160
>>>>>>> master
Conclusion
<<<<<<< HEAD
Nous avons ainsi présenté pas à pas trois exemples différents
d’utilisation de l’AFE et en suivant de la CFA. L’idée était de
présenter une méthode ancienne mais peu utilisée en dehors de la
Psychologie. Il ne s’agit pas de remplacer l’ACP mais de proposer une
alternative, et surtout de proposer aux usagers de faire un choix
conscient sur la méthode plutôt que de répondre à une habitude
disciplinaire.
=======
Nous avons ainsi présenté pas à pas un exemple d’utilisation de l’AFE
et en suivant de la CFA. L’idée était de présenter une méthode ancienne
mais peu utilisée en dehors de la Psychologie. Il ne s’agit pas de
remplacer l’ACP mais de proposer une alternative, et surtout de proposer
aux usagers de faire un choix conscient sur la méthode plutôt que de
répondre à une habitude disciplinaire.
>>>>>>> master
Ainsi, si vous souhaitez explorer vos données et identifier des
facteurs latents corrélés (ou non) afin de faire émerger une structure
synthétique, voir si la structure observée est cohérente avec un modèle
théorique, ou encore si cette structure observée est stable dans le
temps, alors l’utilisation du couple entre AFE/CFA est tout-à-fait
<<<<<<< HEAD
pertinente.
=======
pertinente. On peut en effet tester si un modèle éprouvé sur des données
récoltées en 2011, serait bien le même en 2023 où s’il aurait subi des
modifications, liées au contexte du sujet étudié.
>>>>>>> master
Bibliographie
<<<<<<< HEAD
=======
Aguinis, H., Gottfredson, R. K., & Joo, H. (2013).
Best-Practice Recommendations for Defining, Identifying, and Handling
Outliers. Organizational Research Methods, 16(2), 270-301. https://doi.org/10.1177/1094428112470848
Bakker, M., & Wicherts, J. M. (2014). Outlier removal, sum
scores, and the inflation of the type I error rate in independent
samples t tests: The power of alternatives and recommendations.
Psychological Methods, 19(3), 409–427. https://doi.org/10.1037/met0000014
>>>>>>> master
Bartlett, M.S. (1937) Properties of Sufficiency and Statistical
Test. Proceedings of the Royal Society A, 160, 268-282. https://doi.org/10.1098/rspa.1937.0109
Benzecri J.-P. (1973), L’analyse des données, Paris, Dunod,
vol. 2 : Correspondances
Farrar, D. E., & Glauber, R. R. (1967). Multicollinearity in
Regression Analysis: The Problem Revisited. The Review of Economics and
Statistics, 49(1), 92–107. https://doi.org/10.2307/1937887.
Flora, D. B., & Flake, J. K. (2017), The purpose and practice
of exploratory and confirmatory factor analysis in psychological
research: Decisions for scale development and validation. Canadian
Journal of Behavioural Science / Revue canadienne des sciences du
comportement, 49(2), 78–88. https://doi.org/10.1037/cbs0000069
<<<<<<< HEAD
Gnanadesikan, R., & Kettenring, J. R. (1972), Robust
Estimates, Residuals, and Outlier Detection with Multiresponse Data.
Biometrics, 28(1), 81–124. https://doi.org/10.2307/2528963
=======
>>>>>>> master
Hooper, D., Coughlan, J., & Mullen, M. R. (2008), Structural
Equation Modelling: Guidelines for Determining Model Fit. The Electronic
Journal of Business Research Methods, 6, 53-60.
Kaiser, H.F. (1974) An index of factorial simplicity.
Psychometrika 39, 31–36. https://doi.org/10.1007/BF02291575
Kyriazos, T. and Poga, M. (2023) Dealing with Multicollinearity
in Factor Analysis: The Problem, Detections, and Solutions. Open Journal
of Statistics, 13, 404-424. doi: 10.4236/ojs.2023.133020
Kyriazos, T. and Poga-Kyriazou, M. (2023) Applied Psychometrics:
Estimator Considerations in Commonly Encountered Conditions in CFA, SEM,
and EFA Practice. Psychology, 14, 799-828. doi: https://doi.org/10.4236/psych.2023.145043
Leys, C., Klein, O., Dominicy, Y., and Ley., C., 2018, “Detecting
Multivariate Outliers: Use a Robust Variant of the Mahalanobis
Distance.” Journal of Experimental Social Psychology 74: 150–56. https://doi.org/10.1016/j.jesp.2017.09.011
<<<<<<< HEAD
Mahalanobis, P., C., 1936, « On the generalised distance in
statistics », Proceedings of the National Institute of Sciences of
India, vol. 2, no 1, 1936, p. 49–55
=======
Leys, C., et al. (2019). How to Classify, Detect, and Manage
Univariate and Multivariate Outliers, With Emphasis on Pre-Registration.
International Review of Social Psychology, 32(1): 5, 1–10. DOI: https://doi.org/10.5334/irsp.289
>>>>>>> master
Makowski, (2018). The psycho Package: an Efficient and
Publishing-Oriented Workflow for Psychological Science. Journal of Open
Source Software, 3(22), 470. https://doi.org/10.21105/joss.00470
Pages, J-P., et al., (1979), Analyse factorielle : Un peu
d’histoire et de géométrie, Revue de statistiques appliquée, tome 27,
n°1, p.5-28.
Pearson F.R.S., K. (1901) LIII. On lines and planes of closest
fit to systems of points in space, The London, Edinburgh, and Dublin
Philosophical Magazine and Journal of Science, 2:11, 559-572, DOI: 10.1080/14786440109462720
<<<<<<< HEAD
Pennycook G, Cheyne JA, Koehler DJ, Fugelsang JA, 2020, On the
belief that beliefs should change according to evidence: Implications
for conspiratorial, moral, paranormal, political, religious, and science
beliefs. Judgment and Decision Making. 2020;15(4):476-498. doi:[10.1017/S1930297500007439](https://doi.org/10.1017/S1930297500007439)
=======
Schreiber, J.B., (2021), Issues and recommendations for
exploratory factor analysis and principal component analysis, Research
in Social and Administrative Pharmacy, Volume 17, Issue 5, 2021, Pages
1004-1011, ISSN 1551-7411, https://doi.org/10.1016/j.sapharm.2020.07.027.
>>>>>>> master
Spearman, C. (1904). The Proof and Measurement of Association
between Two Things. The American Journal of Psychology, 15(1), 72–101.
https://doi.org/10.2307/1412159
Tabachnick, B., & Fidell, L., (2014), Using Multivariate
Statistics (6th ed.). Harlow: Pearson Education
<<<<<<< HEAD
Van Laar, S., & Braeken, J., 2021, Understanding the
Comparative Fit Index : It’s All About Base !, Practical Assessment,
Reasearch & Evaluation, Vol 26, N°26
=======
Tobacyk, J., & Milford, G. (1983). Belief in paranormal
phenomena: Assessment instrument development and implications for
personality functioning. Journal of personality and social psychology,
44(5), 1029.
Tobacyk, J. J., Nagot, E., & Miller, M. (1988). Paranormal
Beliefs and Locus of Control: A Multidimensional Examination. Journal of
Personality Assessment, 52(2), 241–246. https://doi.org/10.1207/s15327752jpa5202_5
Tobacyk, J. J. (2004). A revised paranormal belief scale.
International Journal of Transpersonal Studies, 23(1), 94–98..
International Journal of Transpersonal Studies, 23 (1). http://dx.doi.org/10.24972/ijts.2004.23.1.94
Van Laar, S., & Braeken, J., 2021, Understanding the
Comparative Fit Index : It’s All About Base !, Practical Assessment,
Reasearch & Evaluation, Vol 26, N°26
Watkins, M. W. (2018). Exploratory Factor Analysis: A Guide to
Best Practice. Journal of Black Psychology, 44(3), 219-246. https://doi.org/10.1177/0095798418771807
>>>>>>> master
Yong, A. G., & Pearce, S. (2013) A Beginner’s Guide to Factor
Analysis: Focusing on Exploratory Factor Analysis, Tutorials in
Quantitative Methods for Psychology, 9(2), 79-94. doi: 10.20982/tqmp.09.2.p079
Zijlstra, W. P., van der Ark, L. A., & Sijtsma, K. (2011).
Outliers in Questionnaire Data: Can They Be Detected and Should They Be
Removed? Journal of Educational and Behavioral Statistics, 36(2),
186–212. http://www.jstor.org/stable/29789477
Annexes
Info session
<<<<<<< HEAD
=======
>>>>>>> master
setting
value
version
<<<<<<< HEAD
R version 4.2.2 (2022-10-31 ucrt)
=======
R version 4.4.2 (2024-10-31)
>>>>>>> master
os
<<<<<<< HEAD
Windows 10 x64 (build 22631)
=======
Ubuntu 22.04.5 LTS
>>>>>>> master
system
<<<<<<< HEAD
x86_64, mingw32
=======
x86_64, linux-gnu
>>>>>>> master
ui
<<<<<<< HEAD
RTerm
=======
X11
>>>>>>> master
language
<<<<<<< HEAD
(EN)
=======
fr_FR:en
>>>>>>> master
collate
<<<<<<< HEAD
French_France.utf8
=======
fr_FR.UTF-8
>>>>>>> master
ctype
<<<<<<< HEAD
French_France.utf8
=======
fr_FR.UTF-8
>>>>>>> master
tz
Europe/Paris
date
<<<<<<< HEAD
2024-05-21
=======
2024-12-18
>>>>>>> master
pandoc
<<<<<<< HEAD
3.1.1 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/
(via rmarkdown)
=======
3.1.1 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/ (via
rmarkdown)
>>>>>>> master
<<<<<<< HEAD
=======
>>>>>>> master
package
ondiskversion
source
correlation
<<<<<<< HEAD
0.8.4
CRAN (R 4.2.3)
=======
0.8.6
CRAN (R 4.4.2)
>>>>>>> master
corrplot
<<<<<<< HEAD
0.92
CRAN (R 4.2.2)
=======
0.95
CRAN (R 4.4.2)
>>>>>>> master
dplyr
<<<<<<< HEAD
1.1.2
CRAN (R 4.2.3)
=======
1.1.4
CRAN (R 4.4.2)
>>>>>>> master
EFA.dimensions
<<<<<<< HEAD
0.1.7.7
CRAN (R 4.2.3)
=======
0.1.8.4
CRAN (R 4.4.2)
effectsize
0.8.9
CRAN (R 4.4.2)
>>>>>>> master
ggplot2
<<<<<<< HEAD
3.4.2
CRAN (R 4.2.3)
=======
3.5.1
CRAN (R 4.4.2)
>>>>>>> master
ggraph
<<<<<<< HEAD
2.1.0
CRAN (R 4.2.2)
=======
2.2.1
CRAN (R 4.4.2)
>>>>>>> master
here
1.0.1
<<<<<<< HEAD
CRAN (R 4.2.2)
=======
CRAN (R 4.4.2)
>>>>>>> master
lattice
<<<<<<< HEAD
0.20.45
CRAN (R 4.2.2)
=======
0.22.5
CRAN (R 4.3.1)
>>>>>>> master
lavaan
<<<<<<< HEAD
0.6.16
CRAN (R 4.2.3)
=======
0.6.19
CRAN (R 4.4.2)
>>>>>>> master
nFactors
2.4.1.1
<<<<<<< HEAD
CRAN (R 4.2.3)
=======
CRAN (R 4.4.2)
>>>>>>> master
pacman
0.5.1
<<<<<<< HEAD
CRAN (R 4.2.3)
=======
CRAN (R 4.4.2)
>>>>>>> master
parameters
<<<<<<< HEAD
0.21.1
CRAN (R 4.2.3)
performance
0.10.4
CRAN (R 4.2.3)
=======
0.23.0
CRAN (R 4.4.2)
>>>>>>> master
psych
<<<<<<< HEAD
2.3.6
CRAN (R 4.2.3)
=======
2.4.6.26
CRAN (R 4.4.2)
>>>>>>> master
RColorBrewer
1.1.3
<<<<<<< HEAD
CRAN (R 4.2.0)
robustbase
0.99.0
CRAN (R 4.2.3)
rrcov
1.7.5
CRAN (R 4.2.3)
=======
CRAN (R 4.1.3)
>>>>>>> master
see
<<<<<<< HEAD
0.8.0
CRAN (R 4.2.3)
=======
0.9.0
CRAN (R 4.4.2)
>>>>>>> master
table1
1.4.3
<<<<<<< HEAD
CRAN (R 4.2.3)
=======
CRAN (R 4.4.2)
>>>>>>> master
terra
<<<<<<< HEAD
1.7.3
CRAN (R 4.2.2)
=======
1.8.5
CRAN (R 4.4.2)
>>>>>>> master
usdm
2.1.7
<<<<<<< HEAD
CRAN (R 4.2.3)
=======
CRAN (R 4.4.2)
>>>>>>> master
Citation
Auteur.e P, Auteur.e S (2021). “Titre de la fiche.” doi:10.48645/xxxxxx, https://doi.org/10.48645/xxxxxx,, https://rzine.fr/publication_rzine/xxxxxxx/.
BibTex :
@Misc{,
title = {Titre de la fiche},
subtitle = {Sous-Titre de la fiche},
author = {Premier Auteur.e and Second Auteur.e},
doi = {10.48645/xxxxxx},
url = {https://rzine.fr/publication_rzine/xxxxxxx/},
keywords = {FOS: Other social sciences},
language = {fr},
publisher = {FR2007 CIST},
year = {2021},
copyright = {Creative Commons Attribution Share Alike 4.0 International},
}
Glossaire